Вы запутались между ??
и ||
в 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
Спасибо,
Счастливого кодирования!!!