Может кто-нибудь объяснить, почему условный оператор и оператор присваивания ведут себя странно при совместном использовании? - PullRequest
1 голос
/ 04 мая 2020

Может кто-нибудь объяснить, почему приведенный ниже код не выдаст ошибку:

var x;
false ? null : x = 1;

Согласно приоритет MDN-оператора условный оператор имеет более высокий оператор приоритет перед оператором присваивания , что означает, что приведенный выше код должен выдавать ошибку, потому что он фактически анализируется как:

var x;
(false ? null : x) = 1

, но он не выдал ошибку, тогда как это работает, как ожидалось :

var x;
x = 1 ? alert(x) : null;

Приведенный выше код анализируется следующим образом:

var x;
x = (1 ? alert(x) : null);

, поскольку условный оператор имеет более высокий приоритет, но почему в моем самом первом коде он не выдаст ошибку, если условный оператор имеет более высокий приоритет, чем оператор присваивания?

Ответы [ 2 ]

3 голосов
/ 04 мая 2020

Если вы посмотрите на фактическую грамматику, две "ветви" условного оператора: выражения присваивания . Таким образом,

false ? null : x = 1;

анализируется как

false ? (null) : (x = 1);

, поскольку выражение first в конструкции ? : является выражением короткого замыкания в грамматике выражение

x = 1 ? alert(x) : null;

анализируется как

x = (1 ? alert(x) : null);
0 голосов
/ 04 мая 2020

Поскольку условный оператор имеет более высокий приоритет, чем оператор присваивания, ваш первый блок по существу равен

var x;
(false ? null : x ) = 1;

, а (false ? null : x ) становится x, поэтому весь блок становится

var x;
x = 1;

если бы это было (true ? null : x ), тогда вторая строка была бы равна null = 1, что является неправильным синтаксисом, но я считаю, что ошибка не будет выдана.

...