【问题标题】:Javascript object initialization and evaluation order [duplicate]Javascript对象初始化和评估顺序[重复]
【发布时间】:2013-06-30 13:13:49
【问题描述】:

如果我写

var a = [1,2];
var b = {
  foo: a.pop(),
  bar: a.pop()
};

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

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

【问题讨论】:

  • 为什么它是特定于实现的? pop 改变原始数组。
  • @elclanrs,我认为问题在于对象b 的属性值是否将始终按照它们在代码中列出的顺序进行评估。
  • 哦,我明白了...这实际上是一个很好的问题,但是虽然对象中属性的顺序是微不足道的,但评估的顺序却不是,所以我会说这是非问题,但我可能错了......

标签: javascript semantics


【解决方案1】:

参见 ECMAScript section 11.1.5 定义如何解析 ObjectLiteral 产生式。

特别是:

PropertyNameAndValueList , PropertyName : AssignmentExpression 评估如下:

  1. 评估 PropertyNameAndValueList。

  2. 评估 PropertyName。

  3. 评估 AssignmentExpression。

...

其中 (1) 是递归定义。

这意味着对象字面量中最左边的项将首先得到评估,因此{foo: 2, bar: 1} 确实是规范强制要求的。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-04-03
      • 2010-12-08
      • 2023-03-03
      • 2010-11-27
      • 2010-11-17
      • 1970-01-01
      • 2019-01-05
      相关资源
      最近更新 更多