[英]Is the order of destructuring assignment in JavaScript guaranteed?
解构赋值的顺序是否保证从左到右? 例如,在这段代码中:
[ curItem.props, curItem ] = foo(curItem)
其中 foo 返回一个包含两个值的数组。
被分配到curItem.props
一定会发生的分配给前curItem
?
根据我对标准的阅读,确实如此,但这是一个难以阅读的标准。
是的,它由运行时语义保证: IteratorDestructuringAssignmentEvaluation ,特别是生产
AssignmentElementList: AssignmentElementList , AssignmentElisionElement
它首先递归地计算目标表达式左侧的赋值(直到它到达空列表),然后是列表中的最后一个元素(跳过省略元素)。 因此,在您的示例[ curItem.props, curItem ]
,在curItem.props
引用之前评估并分配了curItem
引用。
然而有趣的是,当使用解构语法时, =
运算符左侧的整个表达式是在右侧之后计算的,这与正常赋值目标的严格从左到右的计算相反。 在
[ curItem.props ] = foo(curItem)
在foo
调用之后评估curItem.props
引用,而在
curItem.props = foo(curItem)[0]
它在 之前被评估。 见第12.15.4 节。
如果您相信 Babel 符合规范,您可以随时尝试自己验证:
[ curItem.props, curItem ] = foo(curItem);
转译为
"use strict";
var _foo = foo(curItem);
curItem.props = _foo[0];
curItem = _foo[1];
_foo;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.