Запутались в выражениях ?? и || в JS?

Вы запутались между ?? и || в javascript. Большинство людей думают, что оба понятия одинаковы, но это не так. Цели у них разные.

|| — это оператор OR, а ?? — нулевой коалесцирующий оператор.

В чем разница?

О ||

Это оператор OR. Оператор OR проверяет операнды и возвращает истинный операнд, если любой из операндов верен или истинен.

Вот примеры:

true || false // true because first operand is true
1 || false // 1 because first operand is 1 i.e truthy
false || "Hello" // "Hello" because second operand is "Hello" i.e truthy
Войти в полноэкранный режим Выйти из полноэкранного режима

Выглядит хорошо, тогда в чем проблема с || и зачем нам нужен ??.

Посмотрите на этот фрагмент

0 || 1 // 1 In javascript 0 is falsy value so || operator will ignore it.
"" || 1 // 1 because "" is empty string in JS empty string is falsy value.
Войти в полноэкранный режим Выйти из полноэкранного режима

Но 0 — это не фальшивое значение, а число. Установка переменной в 0 не означает, что переменной задано ложное значение. Когда в строке нет символов, мы называем ее пустой. Если в строке нет символов, это не означает, что она ложная.

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

Пример:
Из бэкенд-сервиса мы получаем оценки студентов. Предположим, что для некоторых студентов есть дополнительные предметы, а для студентов, у которых нет дополнительных предметов, API выдает для этих предметов значение null или undefined. Во фронтенде, если оценки по предметам равны нулю или не определены, мы должны показать «NA». Мы можем написать так

Object.keys(marks).forEach(subject => {
 console.log(subject + " -> " + (marks[subject] || "NA")
})
Войти в полноэкранный режим Выйти из полноэкранного режима

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

Мы должны изменить код следующим образом

Object.keys(marks).forEach(subject => {
 console.log(subject + " -> " + (marks[subject] || marks[subject]) == 0 ? marks[subject] : "NA"))
})
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь у нас есть решение этой проблемы в javascript, чтобы избежать этих сценариев, т.е. nullish coalescing operator.

Оператор Nullish Coalescing проверяет операнды и выдает не нулевое значение. Посмотрите на следующий фрагмент.

0 ?? 1 // 0 
"" ?? 1 // ""
0 ?? null // 0
null ?? 1 // 1
Вход в полноэкранный режим Выйти из полноэкранного режима

Поскольку 0 и «» не являются нулевыми значениями, он будет считать их таковыми.

Какие значения являются нулевыми?

  • null
  • undefined

Спасибо,
Счастливого кодирования!!!

Оцените статью
devanswers.ru
Добавить комментарий