以下变量是什么?

时间:2017-06-27 23:06:47

标签: javascript

当我在控制台中运行命令x = 'test'.match(/(t(e)/)时,我得到以下输出。

["te", "e", index: 0, input: "test"]

然后我运行以下命令:

x.length 输出:2

Object.keys(x).length 输出:4

这里发生了什么?该变量似乎是一个数组文字,在索引2和3处有对象文字。抱歉,如果这是一个非常棒的问题,但是当我尝试做的时候

x = ["te", "e", index: 0, input: "test"] 我明白了 Uncaught SyntaxError: Unexpected token :这是预期的,但我很困惑函数如何设置x

4 个答案:

答案 0 :(得分:2)

Lemme帮助

  • ["te", "e", index: 0, input: "test"]match函数返回的对象的字符串化版本。
  • x不是“设置为”。 x设置为描述正则表达式匹配的对象。当您执行console.log(x)时,会在引擎盖下调用x.toString()并返回["te", "e", index: 0, input: "test"]。为方便起见,这只是一个文本表示。底层结构更复杂。

现在对于其他陷阱:

  • "te"已与您的正则表达式匹配
  • "e"是此匹配的捕获(因为正则表达式中的括号)
  • x.length描述了找到的匹配/抓取次数
  • Object.keys(x).length是4.您有2个捕获(2个密钥),您为indexinput添加了2个密钥

答案 1 :(得分:2)

数组是对象,索引是属性名称,但未在数组文字中显示。控制台混合了数组和对象文字语法(如果用作代码则无效)。

等效的对象文字是:

{
 0: "te",
 1: "e",
 index: 0,
 input: "test"
};

但是对象文字构造普通对象,而不是Array对象。您可以使用以下方法构造一个等效数组:

var x = ['te', 'e'];
x.index = 0;
x.input = 'test';

答案 2 :(得分:0)

'test'.match(/(t(e)/)的结果实际上只是["te", "e"],其长度为2,似乎就是你想要的,所以你可以使用x = ["te", "e"]

答案 3 :(得分:0)

“数组是类似列表的对象,其原型具有执行遍历和变异操作的方法。”来自MDN

当你在这里访问'index'或'input'时,它就像一个对象的属性,就像任何其他对象一样。

试试这个:

a = new Array() 
a.hello = 'world' 
console.log(a.hello)
console.log(Object.keys(a)) 

您将获得以下输出:

'world' 
['hello']