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

edA*_*a-y 3 javascript language-lawyer ecmascript-6

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

[ curItem.props, curItem ] = foo(curItem)
Run Code Online (Sandbox Code Playgroud)

其中 foo 返回一个包含两个值的数组。

分配 to 是否curItem.props保证在分配给之前发生curItem

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

Ber*_*rgi 6

是的,它由运行时语义保证: IteratorDestructuringAssignmentEvaluation,特别是生产

AssignmentElementList: AssignmentElementList , AssignmentElisionElement
Run Code Online (Sandbox Code Playgroud)

它首先递归计算目标表达式左侧的赋值(直到它到达空列表),然后是列表中的最后一个元素(跳过省略元素)。所以在你的例子中[ curItem.props, curItem ]curItem.props引用在curItem引用之前被评估和分配。

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

[ curItem.props ] = foo(curItem)
Run Code Online (Sandbox Code Playgroud)

curItem.props参考被评估foo呼叫,而在

curItem.props = foo(curItem)[0]
Run Code Online (Sandbox Code Playgroud)

在 之前被评估。见第12.15.4 节