以下代码段通过混合括号和方括号来指定一些值而没有任何错误,但是大多数其他组合(例如方括号内的括号)根本不起作用。
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是我的小提琴。
编辑:我知道正确使用括号(我的小提琴已经有了它),但我问的是,如果结果在这种错误的使用中是确定性的。由于我尝试的口译员不会产生任何错误并给出相同的结果,我想知道这些结果是否由标准确保和/或所有其他口译人员都会这样做。答案 0 :(得分:3)
逗号运算符计算每个操作数(从左到右) 并返回最后一个操作数的值。
所以
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;
规范声明即使只返回最后一项,也必须评估每个项目“因为它可能具有可观察性
副作用。“在这个最常见的用例中,每个变量都赋值给它们。