【问题标题】:Mixing parentheses and square brackets in array initialization在数组初始化中混合括号和方括号
【发布时间】:2020-04-19 14:17:05
【问题描述】:

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

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)在面对非法使用时所做的?

var myItems = [];

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

document.getElementById("demo").innerHTML = 
"myItems[5]:       " + myItems[5]       + "<br/>" +
"myItems[5][0]:    " + myItems[5][0]    + "<br/>" +
"myItems[5][1]:    " + myItems[5][1]    + "<br/>" +
"myItems[5][2]:    " + myItems[5][2]    + "<br/>" +
"myItems[5][2][0]: " + myItems[5][2][0] + "<br/>" +
"myItems[5][2][1]: " + myItems[5][2][1] + "<br/>" +
"myItems[5][2][2]: " + myItems[5][2][2] + "<br/>" +
"";
&lt;p id="demo"&gt;&lt;/p&gt;

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

【问题讨论】:

  • [有,你,[试过,使用],[方括号]]
  • 是的,我知道这个,但实际上我并没有问正确的用法是什么。

标签: javascript


【解决方案1】:

来自MDN on comma operator

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

所以

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

转向

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

现在您已经得到了一个包含 6 个元素的数组(5x 未定义以及您在第六位分配的三个字符串的数组)。

这正是您打印出来的内容。

【讨论】:

  • 这并不能真正回答问题
  • 读取逗号分隔符会显示它返回最后一个操作数的值,而将数组包装在括号中什么都不做。
  • 我认为这个问题没有很好理解。请参阅问题的编辑部分。 @destoryer:如果您的评论证明了返回最后一个操作数的原因,那将更接近答案。
  • 之前很清楚,但是通过审核队列很容易忽略相对低代表用户的单行回答。充实答案(正如您现在所做的那样)是防止他们首先出现在低质量队列中的showing up 的好方法。
【解决方案2】:

逗号运算符,“评估其每个操作数(从左到右)并返回最后一个操作数的值。” (你可以把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; 规范指出,即使只返回最后一项,也必须评估每个项目“因为它可能具有可观察的 副作用。”在这个最常见的用例中,每个变量都有分配给它们的值。

【讨论】:

    猜你喜欢
    • 2017-07-24
    • 2017-06-30
    • 2015-05-12
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多