Странность с использованием ||для назначения, где условный (троичный) оператор является вторым вариантом - PullRequest
0 голосов
/ 26 января 2019

В моем коде обнаружена ошибка, когда я использую foo = bar || baz для назначения baz, если bar не определен, однако при использовании троичного выражения для второго аргумента JS назначит истинное значение для троичного выражения, независимо от того,первого значения.

Открыл консоль и проверил ее.Кажется, что JS даже не оценивает условное выражение, как показано здесь, где b не определено, но все равно возвращает его истинное значение.

>>> a = 1 || 2
1
>>> a = 0 || 2
2
>>> a = 1 || b
1
>>> a = 1 || b ? 3 : 4
3
>>> b
ReferenceError: b is not defined[Learn More]
>>> a = 1 || ( b ? 3 : 4 )
1

Я могу получить правильный результатоборачивая троичное выражение в () s, но что здесь происходит?Почему он возвращает 3 в приведенном выше тест-кейсе?

1 Ответ

0 голосов
/ 26 января 2019

|| равно ленивый - он не будет пытаться оценить правую часть || левой стороны, которая считается истинной. Если бы вы сделали b || 1 вместо 1 || b, он сначала попытался бы оценить b, и была бы выдана ошибка:

const a = b || 1 ? 3 : 4

вся левая сторона ? интерпретируется как условие. (Другие операции, выполняемые слева от ?, также будут проанализированы до оценки всего условия ?.) Условный оператор имеет одно из низших операторов.

Для

1 || b ? 3 : 4

оператор с наивысшим приоритетом - ||, в 5. Таким образом, два выражения напротив || оцениваются для "или" сначала:

1 || b

Так как 1 является правдой, все 1 || b оценивается как 1 без учета b.

1 ? 3 : 4

Затем выполняется условный оператор (приоритет 4):

true ? 3 : 4

оценивается как

3

потому что условие истинно.

Когда вы ставите круглые скобки вокруг условного:

1 || ( b ? 3 : 4 )

Круглые скобки имеют наивысший приоритет оператора , в 20 - интерпретатор знает, что все, что в скобках, будет оцениваться в одном выражении, независимо от того, что находится за скобками. Так

1 || <something>

оценивается как

1

потому что 1 правдива.

...