Существует ли оператор "объединения с нулем" в JavaScript?
Вопрос: Существует ли оператор объединения с null в JavaScript?
Например, в C# я могу сделать следующее:
String someString = null;
var whatIWant = someString ?? "Cookies!";
Наилучшее приближение, которое я могу найти для JavaScript, это использование условного оператора:
var someString = null;
var whatIWant = someString ? someString : 'Cookies!';
На мой взгляд, это не совсем удобно. Могу ли я сделать это лучше?
5 ответ(ов)
Ваша функция coalesce
действительно реализует логику, похожую на функцию COALESCE
в SQL. Она принимает любое количество аргументов и возвращает первый из них, который не равен null
или undefined
. Если все аргументы равны этим значениям, функция вернет null
.
Вот как работает ваш код:
function coalesce() {
var len = arguments.length;
for (var i=0; i<len; i++) {
// Проверяем, что аргумент не равен null и undefined
if (arguments[i] !== null && arguments[i] !== undefined) {
return arguments[i];
}
}
return null; // Если все аргументы null или undefined, возвращаем null
}
var xyz = {};
xyz.val = coalesce(null, undefined, xyz.val, 5);
// Теперь xyz.val содержит 5
Как вы правильно заметили, в отличие от null
и undefined
, значения вроде ""
(пустая строка), false
и 0
считаются действительными значениями, поэтому они будут возвращены, если будут переданы в функцию.
Если вы знакомы с C# и оператором ??
, то это действительно решение будет интуитивно понятным для вас. Функция coalesce
в JavaScript эффективно обрабатывает множество входных данных и возвращает значение в случае его наличия.
Таким образом, если вам нужно выбрать первое "существующее" значение из нескольких, эта реализация будет отличным вариантом.
Если оператор ||
в качестве заменителя оператора ??
в C# не подходит для вашего случая, так как он "поглощает" пустые строки и нули, вы всегда можете написать свою собственную функцию:
function $N(value, ifnull) {
if (value === null || value === undefined)
return ifnull;
return value;
}
var whatIWant = $N(someString, 'Cookies!');
Эта функция проверяет, является ли значение value
равным null
или undefined
, и если это так, возвращает значение ifnull
. В противном случае возвращается само значение value
.
Предостерегаем от специфического определения null
в JavaScript. В JavaScript существуют два значения, которые могут означать "отсутствие значения".
- Null: Когда переменная равна
null
, это означает, что в ней нет данных, но переменная уже определена в коде. Например:
var myEmptyValue = 1;
myEmptyValue = null;
if (myEmptyValue === null) { window.alert('это null'); }
// вызывает алерт
В этом случае тип вашей переменной на самом деле Object
. Проверьте это:
window.alert(typeof myEmptyValue); // выведет Object
- Undefined: Когда переменная еще не была определена в коде, и, как ожидалось, она не содержит никакого значения. Например:
if (myUndefinedValue === undefined) { window.alert('это undefined'); }
// вызывает алерт
В этом случае тип вашей переменной — undefined
.
Обратите внимание, что если вы используете оператор сравнения с преобразованием типов (==
), JavaScript будет вести себя одинаково для обоих этих значений "пустоты". Чтобы отличать их, всегда используйте оператор строгого сравнения (===
).
В вашем вопросе рассматриваются два оператора в JavaScript:
- Логическое ИЛИ (Logical OR):
const foo = '' || 'default string';
console.log(foo); // вывод: 'default string'
Здесь переменная foo
получает значение второго операнда ('default string'), потому что логическое ИЛИ возвращает первый истинный (truthy) операнд. Поскольку пустая строка (''
) является ложным значением (falsy), оператор возвращает второй операнд.
- Оператор слияния с null (Nullish coalescing operator):
const foo = '' ?? 'default string';
console.log(foo); // вывод: пустая строка ''
В этом случае оператор ??
возвращает левый операнд (в данном случае пустую строку) только если он не равен null
или undefined
. Так как пустая строка является допустимым значением, оператор возвращает именно ее, а не 'default string'.
Суть в том, что оператор ??
предназначен для работы с null
и undefined
, тогда как оператор ||
действует на основе истинных и ложных значений.
Для более глубокого понимания вы можете ознакомиться с документацией: MDN о операторе слияния с null.
Если вам нужно поддерживать старые браузеры и у вас есть иерархия объектов, вы можете использовать такой подход для безопасного доступа к свойствам:
(((body || {}).head || {}).eyes || [])[0] || 'левый глаз';
Здесь:
body || {}
— еслиbody
равноnull
илиundefined
, то вместо этого будет использован пустой объект{}
.- Аналогично, мы проверяем
head
иeyes
, обеспечивая, что при отсутствии какого-либо свойства не произойдет ошибка, а вернется безопасное значение. || []
заменяетeyes
на пустой массив, если он равенnull
илиundefined
, что позволяет избежать попытки обращения к первому элементу несуществующего массива.- В конце, если первый элемент
eyes
равенundefined
, будет возвращено значение по умолчанию'левый глаз'
.
Этот метод эффективен для работы с объектами, где некоторые свойства могут отсутствовать, и помогает избежать ошибок, возникающих при попытке доступа к свойствам null
или undefined
.
Что делает оператор !! (двойной восклицательный знак) в JavaScript?
JavaScript: Знак плюс перед функциональным выражением
Как перенаправить на другую веб-страницу?
Как выполнить функцию JavaScript, имея её имя в виде строки
В чем разница между String.slice и String.substring?