Javascript对象文本中属性求值的顺序

Javascript对象文本中属性求值的顺序,javascript,Javascript,我想这样写(用Javascript): 只有在我能够确保属性值的计算顺序与我编写它们的顺序相同的情况下,这才会实现我想要的功能。该语言是否在任何地方做出了这样的保证?来自: ECMAScript的源文本 程序首先转换为 输入元素的顺序,如下所示: 令牌、行终止符、, 注释或空白。源头 文本从左到右扫描, 反复使用尽可能长的时间 字符序列作为下一个 输入元素 换句话说,是的,规范解决了这个问题。此代码应始终有效: var left = 5, increment = 1; var obj = { l

我想这样写(用Javascript):

只有在我能够确保属性值的计算顺序与我编写它们的顺序相同的情况下,这才会实现我想要的功能。该语言是否在任何地方做出了这样的保证?

来自:

ECMAScript的源文本 程序首先转换为 输入元素的顺序,如下所示: 令牌、行终止符、, 注释或空白。源头 文本从左到右扫描, 反复使用尽可能长的时间 字符序列作为下一个 输入元素

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

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

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

hmm。我可以发誓,上次尝试时,g Chrome没有保持这种顺序。其他浏览器更容易预测,但在Chrome中,我需要客户端排序来恢复顺序。问题不在于代码运行后对象中属性的顺序。问题是在创建对象时应用于每个术语的执行顺序。如果你的Chrome从右到左执行你的代码,那么还有更大的问题在酝酿中。Chris是正确的。我想问的是,Javascript是否保留以不可预测的顺序计算对象文本值的权利,比如Lisp中的“let”形式,或者是否总是按照我编写它们的顺序计算它们,比如“let*”形式。规范文本只说明了如何将程序的原始文本处理为“输入元素”。这篇特别的文章指出了收集到的输入元素的处理顺序。“作为下一个输入元素的最长字符序列”适用于词法分析,它发生在代码执行之前。该语句与在运行时计算组件的时间无关。如果JavaScript确实保证订单,那么该保证将在规范的其他地方列出。有关正确答案,请参阅。
var left = 5, increment = 1;
var obj = { left: left, right: -(left += increment) };
// obj.left  ===  5
// obj.right === -6