Да, это гарантируется семантикой времени выполнения: IteratorDestructuringAssignmentEvaluation , в частности, производством
AssignmentElementList: AssignmentElementList , AssignmentElisionElement
Сначала он рекурсивно оценивает назначения в левой части целевое выражение (до тех пор, пока оно не достигнет пустого списка), затем затем на последнем элементе в списке (пропуск элементов elision). Итак, в вашем примере [ curItem.props, curItem ]
ссылка curItem.props
оценивается и присваивается перед ссылкой curItem
.
Однако интересно отметить, что все выражение в левой части =
оператор оценивается после с правой стороны при использовании синтаксиса деструктурирования, в отличие от строго слева-направо оценки нормальных целей назначения. В
[ curItem.props ] = foo(curItem)
ссылка curItem.props
оценивается после foo
вызова, а в
curItem.props = foo(curItem)[0]
она оценивается до . См. §12.15.4 .