Использование нулевого объединения вместе с методом include

Я заметил это при использовании логики ИЛИ или нулевого объединения с методом 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'

Это ожидаемое поведение? Почему это происходит?

Возможно, вы захотите ознакомиться с приоритетом операторов . Решение, которое вы уже нашли, заключается в том, как с этим справиться.

David 03.06.2024 23:02

Это не странное поведение. Нет какой-либо конкретной причины, по которой желаемый приоритет оператора должен быть фактическим приоритетом.

Unmitigated 03.06.2024 23:04

@MarvineBamba: Как вы думаете, почему именно так должно быть? Какое значение вы ожидаете от выражения 'Hello' ?? ['e', 'z'].includes('xx') и почему?

David 03.06.2024 23:07
'Hello' ?? ['e', 'z'].includes('xx') является правдивым, потому что его значение равно "Hello", поэтому берется положительная сторона троицы, что дает вам "in-array". Вызов .includes() никогда не выполняется.
Alex Wayne 03.06.2024 23:29
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Давайте посмотрим на выражение:

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

Другие вопросы по теме