Я заметил это при использовании логики ИЛИ или нулевого объединения с методом include в троичной форме.
const result = 'Hello' || ['e', 'z'].includes('e') ? 'in-array' : 'not-in-array';
console.info(result) // 'in-array'
const result = 'Hello' ?? ['e', 'z'].includes('z') ? 'in-array' : 'not-in-array';
console.info(result) // 'in-array'
const result = 'Hello' || ['e', 'z'].includes('xx') ? 'in-array' : 'not-in-array';
console.info(result) // 'in-array'
const result = 'Hello' ?? ['e', 'z'].includes('xx') ? 'in-array' : 'not-in-array';
console.info(result) // 'in-array'
Чтобы это работало, вам нужно будет добавить круглые/круглые скобки к правому конечному условию.
const result = 'Hello' || (['e', 'z'].includes('e') ? 'in-array' : 'not-in-array');
console.info(result) // 'Hello'
const result = 'Hello' ?? (['e', 'z'].includes('z') ? 'in-array' : 'not-in-array');
console.info(result) // 'Hello'
Это ожидаемое поведение? Почему это происходит?
Это не странное поведение. Нет какой-либо конкретной причины, по которой желаемый приоритет оператора должен быть фактическим приоритетом.
@MarvineBamba: Как вы думаете, почему именно так должно быть? Какое значение вы ожидаете от выражения 'Hello' ?? ['e', 'z'].includes('xx') и почему?
'Hello' ?? ['e', 'z'].includes('xx') является правдивым, потому что его значение равно "Hello", поэтому берется положительная сторона троицы, что дает вам "in-array". Вызов .includes() никогда не выполняется.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Давайте посмотрим на выражение:
a || b && c
С точки зрения чистой логической логики это неоднозначно. Один из этих двух операторов должен быть выполнен первым, но какой именно?
Это ли это?
(a || b) && c
Или это?
a || (b && c)
Чтобы разрешить эту двусмысленность, разработчики языка решили, что && имеет более высокий приоритет, чем ||, и, следовательно, произойдет раньше, чем операторы с более низким приоритетом.
Которое значит что:
a || (b && c)
является правильной интерпретацией в соответствии со спецификацией языка.
Однако вы можете переопределить это, используя круглые скобки и это:
(a || b) && c
Теперь сначала выполним оператор ||, а затем используем результат в качестве левой части оператора &&.
То же самое и с тройными. || и ?? имеют более высокий приоритет, чем тернарный оператор ?.
Это означает, что это:
a || b ? c : d
Тоже неоднозначно. Должен ли a || b быть левой частью тройной системы? Или вся тройка должна находиться справа от ||? Как вы заметили, результирующая логика другая.
Что происходит, так это то, что это интерпретируется как:
(a || b) ? c : d
потому что || имеет более высокий приоритет, чем ?.
А если вам нужен другой порядок, вы можете использовать круглые скобки, чтобы определить этот порядок:
a || (b ? c : d)
Это похоже на элементарную математику. Каков ответ на это математическое выражение?
1 + 5 × 2
Это 12? Или это 11? Без приоритета операторов это неоднозначно. Учитывая приоритет операторов, с которым мы все согласны, ответ будет 11, потому что × имеет более высокий приоритет, чем +.
И опять же, вы всегда можете переопределить это с помощью круглых скобок:
(1 + 5) × 2 // 12
Возможно, вы захотите ознакомиться с приоритетом операторов . Решение, которое вы уже нашли, заключается в том, как с этим справиться.