2017-07-07 168 views
-1

以下代码段通过混合括号和方括号来赋予某些值而没有任何错误,但大多数其他组合(例如方括号内的括号)完全不起作用。在数组初始化中混合圆括号和方括号

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

[有,你,[尝试,使用],[方括号]] –

+0

是的,我知道这一点,但实际上我没有问到正确的用法是什么。 – ahmedus

回答

2

从​​

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

所以

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

打开到

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

现在,你也得为自己6个元素(5X不确定和三根弦你第六位分配的数组)的数组。

而这正是你打印出来的。

+0

这并没有真正回答问题 –

+1

读取逗号分隔符会显示它返回最后一个操作数的值,并且将数组包装在括号中什么也不做。 – destoryer

+0

我觉得这个问题不好理解。请参阅问题的编辑部分。 @destoryer:如果你的评论证明了为什么最后的操作数被返回,那么它将更接近成为一个答案。 – ahmedus

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;该规范指出,即使只返回最后一个项目,也必须评估每个项目“,因为它可能具有可观察到的副作用。” 在这种最常见的用例中,每个变量都具有赋值给它们的值。