JavaScript中的解构赋值顺序有保证吗?

JavaScript中的解构赋值顺序有保证吗?,javascript,ecmascript-6,language-lawyer,Javascript,Ecmascript 6,Language Lawyer,分解任务的顺序是否保证从左到右?例如,在此代码中: [ curItem.props, curItem ] = foo(curItem) 其中foo返回两个值的数组 对curItem.props的分配是否保证在对curItem的分配之前发生 根据我对标准的理解,确实如此,但这是一个很难理解的标准。如果您相信Babel符合规范,您可以始终: 传送到 "use strict"; var _foo = foo(curItem); curItem.props = _foo[0]; curItem =

分解任务的顺序是否保证从左到右?例如,在此代码中:

[ curItem.props, curItem ] = foo(curItem)
其中foo返回两个值的数组

curItem.props
的分配是否保证在对
curItem
的分配之前发生


根据我对标准的理解,确实如此,但这是一个很难理解的标准。

如果您相信Babel符合规范,您可以始终:

传送到

"use strict";

var _foo = foo(curItem);

curItem.props = _foo[0];
curItem = _foo[1];
_foo;

是的,这是有保证的,特别是生产

AssignmentElementList:AssignmentElementList,AssignmentElisionElement
它首先递归地计算目标表达式左侧的赋值(直到到达空列表),然后计算列表中最后一个元素的赋值(跳过省略元素)。因此,在您的示例
[curItem.props,curItem]
中,
curItem.props
引用在
curItem
引用之前进行评估和分配

然而,值得注意的是,当使用解构语法时,
=
运算符左侧的整个表达式在右侧之后求值,这与正常赋值目标的严格从左到右求值不同。在

[ curItem.props ] = foo(curItem)
curItem.props
引用在调用
foo
后进行评估,同时

curItem.props = foo(curItem)[0]

这是以前评估过的。请参阅。

仅供参考。这…可能很难理解,是的。通过规范进行的一些测试似乎也假设订单是有保证的。当然,它可以归结为:
var\u a=foo(curItem),curItem.props=\u a[0],curItem=\u a[1]是的,这将发生在curItemECMAScript尽最大努力完全避免非100%确定和指定的行为之前,并且主要避免实现定义的行为,因此如果您运行某个程序,它会做您想要的事情,它很有可能做到这一点,因为规范这么说。它可能符合规范,但语义仍然无法保证。例如,它可能是未定义的顺序——尽管我对此表示怀疑,因为旧语言因为没有定义这些东西而陷入了麻烦。此外,您在这里给出的传输代码实际上是一种简化,因为规范要求使用迭代器。是的。这是在
loose
模式下。
curItem.props = foo(curItem)[0]