Гарантирован ли порядок присвоения деструктуры в JavaScript? - PullRequest
2 голосов
/ 24 марта 2020

Гарантируется ли порядок деструктурирующих заданий слева направо? Например, в этом коде:

[ curItem.props, curItem ] = foo(curItem)

Где foo возвращает массив из двух значений.

Гарантируется ли присвоение curItem.props до присвоения curItem?

В соответствии с моим прочтением стандарта это соответствует нормам, но читать его трудно.

Ответы [ 2 ]

5 голосов
/ 24 марта 2020

Да, это гарантируется семантикой времени выполнения: 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 .

0 голосов
/ 24 марта 2020

Если вы доверяете Вавилону в соответствии со c, вы всегда можете попробовать проверить вещи самостоятельно :

[ curItem.props, curItem ] = foo(curItem);

переносится в

"use strict";

var _foo = foo(curItem);

curItem.props = _foo[0];
curItem = _foo[1];
_foo;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...