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。
解构赋值的顺序能保证是从左到右吗?例如,在这段代码中:
[ 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。