当我在控制台中运行命令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
。
答案 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个密钥),您为index
和input
添加了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']