在数组初始化中混合括号和方括号

时间:2017-07-07 13:48:20

标签: javascript

以下代码段通过混合括号和方括号来指定一些值而没有任何错误,但是大多数其他组合(例如方括号内的括号)根本不起作用。

var myItems = [];
myItems[5] = ("A1", "B1", ["C1","C2","C3"]);

当我打印这些值时,它们在两个不同的浏览器中完全相同。

myItems[5]: C1,C2,C3
myItems[5][0]: C1
myItems[5][1]: C2
myItems[5][2]: C3
myItems[5][2][0]: C
myItems[5][2][1]: 3
myItems[5][2][2]: undefined

似乎只考虑方括号内的部分。这个结果是由JavaScript标准(ECMA-262)定义的吗?或者它是非法使用的解释器/引擎(我的情况下是Chrome和Firefox)做了什么?

Here是我的小提琴。

编辑:我知道正确使用括号(我的小提琴已经有了它),但我问的是,如果结果在这种错误的使用中是确定性的。由于我尝试的口译员不会产生任何错误并给出相同的结果,我想知道这些结果是否由标准确保和/或所有其他口译人员都会这样做。

2 个答案:

答案 0 :(得分:3)

来自MDN on comma operator

  

逗号运算符计算每个操作数(从左到右)   并返回最后一个操作数的值。

所以

myItems[5] = ("A1", "B1", ["C1","C2","C3"]);

转向

myItems[5] = (["C1","C2","C3"]);

现在你已经拥有了一个包含6个元素的数组(5x undefined和你在第六个位置分配的三个字符串的数组)。

这正是你打印出来的。

答案 1 :(得分:1)

逗号运算符,“计算每个操作数(从左到右)并返回最后一个操作数的值。” (您可以将quote from Mozilla视为福音,或try to decipher what ECMA has to say on the matter。)

分组运算符( )“控制表达式中评估的优先级,”根据Mozilla。 (Obligatory link to ECMA。)

在这种情况下,分组运算符基本上不执行任何操作,因为只有一个表达式被分组。所以这是一个简单的以逗号分隔的值列表,其中最后一个是数组。这是分配的内容。

在批量分配变量时经常会看到逗号运算符,例如var foo = 1, bar = 2, baz = 3;规范声明即使只返回最后一项,也必须评估每个项目“因为它可能具有可观察性 副作用。“在这个最常见的用例中,每个变量都赋值给它们。