【问题标题】:Order of attribute evaluation in Javascript object literals [duplicate]Javascript对象文字中的属性评估顺序[重复]
【发布时间】:2010-11-27 01:04:16
【问题描述】:

我想写这样的东西(在 Javascript 中):

var obj = { left: left, right: -(left += increment) };

如果我可以确定属性值将按照我编写它们的相同顺序进行评估,这只会做我想做的事情。语言是否在任何地方做出这样的保证?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    来自ECMA 3rd Edition specifications

    ECMAScript 的源文本 程序首先转换为 输入元素的序列,它们是 无论是令牌,行终止符, cmets 或空白空间。来源 文本从左到右扫描, 反复服用尽可能长的时间 字符序列作为下一个 输入元素。

    换句话说,是的,规范解决了这个问题。此代码应始终有效:

    var left = 5, increment = 1;
    var obj = { left: left, right: -(left += increment) };
    // obj.left  ===  5
    // obj.right === -6
    

    这与属性存储在对象中的顺序无关,而是 JavaScript 评估语句的顺序:从左到右,从上到下。

    【讨论】:

    • 嗯。我可以发誓我上次尝试这个时 g Chrome 未能保持这个顺序。其他浏览器更容易预测,但在 Chrome 中我需要一个客户端排序来恢复顺序。
    • 问题不在于代码运行后对象中属性的顺序。问题是关于在创建对象时将应用于每个术语的执行顺序。如果您的 Chrome 是从右到左执行您的代码,则会出现更大的问题。
    • 克里斯是正确的。我在问 Javascript 是否保留以不可预知的顺序评估对象文字值的权利,比如 Lisp 中的“let”形式,或者它是否总是按照我写它们的顺序来评估它们,比如“让*" 形式。
    • 规范文本仅说明程序的原始文本如何处理成“输入元素”。此特定文本说明了处理收集的输入元素的顺序。
    • “最长可能的字符序列作为下一个输入元素”适用于词法分析,这发生在代码执行之前。该语句与在运行时评估组件时无关。如果 JavaScript 确实保证了订单,那么该保证将列在规范的其他地方。正确答案见stackoverflow.com/a/17438220/831878
    猜你喜欢
    • 2013-06-30
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    相关资源
    最近更新 更多