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?
根据我对标准的阅读,确实如此,但这是一个难以阅读的标准。
是的,它由运行时语义保证: 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 节。