JavaScript对象的初始化和评估顺序

10
如果我写下来。
var a = [1,2];
var b = {
  foo: a.pop(),
  bar: a.pop()
};

根据规范,b的值是多少?

(通过实验,它是{foo: 2, bar: 1},但我担心这可能是特定于实现的。)


为什么它会因实现而异?pop会改变原始数组。 - elclanrs
1
@elclanrs,我认为问题所在是关于对象b的属性值是否总是按照代码中列出的顺序进行评估。 - go-oleg
哦,我明白了...现在这是一个好问题,但是虽然对象属性的顺序是微不足道的,但是评估的顺序却不是,所以我认为这不是问题,但我可能错了... - elclanrs
2个回答

12
请参考ECMAScript第11.1.5节,其中定义了如何解析ObjectLiteral表达式。

特别地:

PropertyNameAndValueListPropertyNameAssignmentExpression的评估如下:

  1. 计算PropertyNameAndValueList

  2. 计算PropertyName

  3. 计算AssignmentExpression

...

其中(1)是递归定义。

这意味着对象字面量中最左边的项将首先被计算,因此{foo:2,bar:1}确实符合规范。


1
它们按照编写顺序进行评估。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接