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

Is the order of destructuring assignment in JavaScript guaranteed?

解构赋值的顺序能保证是从左到右吗?例如,在这段代码中:

[ curItem.props, curItem ] = foo(curItem)

其中 foo returns 两个值的数组。

curItem.props 的赋值是否保证在对 curItem 的赋值之前发生?

根据我对标准的阅读,确实如此,但这是一个很难阅读的标准..

如果你相信 Babel 是符合规范的,你总是可以 try verify things yourself:

[ curItem.props, curItem ] = foo(curItem);

转译为

"use strict";

var _foo = foo(curItem);

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

是的,由 Runtime Semantics: IteratorDestructuringAssignmentEvaluation 保证,特别是生产

AssignmentElementList: AssignmentElementList , AssignmentElisionElement

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

然而,有趣的是,当使用解构语法时,= 运算符左侧的整个表达式在右侧 之后求值,与正常分配目标的严格从左到右的评估相反。在

[ curItem.props ] = foo(curItem)

curItem.props 引用在 foo 调用之后被评估,而在

curItem.props = foo(curItem)[0]

它在之前被评估。参见 §12.15.4