15

Существует ли оператор "объединения с нулем" в JavaScript?

11

Вопрос: Существует ли оператор объединения с null в JavaScript?

Например, в C# я могу сделать следующее:

String someString = null;
var whatIWant = someString ?? "Cookies!";

Наилучшее приближение, которое я могу найти для JavaScript, это использование условного оператора:

var someString = null;
var whatIWant = someString ? someString : 'Cookies!';

На мой взгляд, это не совсем удобно. Могу ли я сделать это лучше?

5 ответ(ов)

0

Ваша функция 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 эффективно обрабатывает множество входных данных и возвращает значение в случае его наличия.

Таким образом, если вам нужно выбрать первое "существующее" значение из нескольких, эта реализация будет отличным вариантом.

0

Если оператор || в качестве заменителя оператора ?? в C# не подходит для вашего случая, так как он "поглощает" пустые строки и нули, вы всегда можете написать свою собственную функцию:

function $N(value, ifnull) {
    if (value === null || value === undefined)
        return ifnull;
    return value;
}

var whatIWant = $N(someString, 'Cookies!');

Эта функция проверяет, является ли значение value равным null или undefined, и если это так, возвращает значение ifnull. В противном случае возвращается само значение value.

0

Предостерегаем от специфического определения null в JavaScript. В JavaScript существуют два значения, которые могут означать "отсутствие значения".

  1. Null: Когда переменная равна null, это означает, что в ней нет данных, но переменная уже определена в коде. Например:
var myEmptyValue = 1;
myEmptyValue = null;
if (myEmptyValue === null) { window.alert('это null'); }
// вызывает алерт

В этом случае тип вашей переменной на самом деле Object. Проверьте это:

window.alert(typeof myEmptyValue); // выведет Object
  1. Undefined: Когда переменная еще не была определена в коде, и, как ожидалось, она не содержит никакого значения. Например:
if (myUndefinedValue === undefined) { window.alert('это undefined'); }
// вызывает алерт

В этом случае тип вашей переменной — undefined.

Обратите внимание, что если вы используете оператор сравнения с преобразованием типов (==), JavaScript будет вести себя одинаково для обоих этих значений "пустоты". Чтобы отличать их, всегда используйте оператор строгого сравнения (===).

0

В вашем вопросе рассматриваются два оператора в JavaScript:

  1. Логическое ИЛИ (Logical OR):
const foo = '' || 'default string';
console.log(foo); // вывод: 'default string'

Здесь переменная foo получает значение второго операнда ('default string'), потому что логическое ИЛИ возвращает первый истинный (truthy) операнд. Поскольку пустая строка ('') является ложным значением (falsy), оператор возвращает второй операнд.

  1. Оператор слияния с null (Nullish coalescing operator):
const foo = '' ?? 'default string';
console.log(foo); // вывод: пустая строка ''

В этом случае оператор ?? возвращает левый операнд (в данном случае пустую строку) только если он не равен null или undefined. Так как пустая строка является допустимым значением, оператор возвращает именно ее, а не 'default string'.

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

Для более глубокого понимания вы можете ознакомиться с документацией: MDN о операторе слияния с null.

0

Если вам нужно поддерживать старые браузеры и у вас есть иерархия объектов, вы можете использовать такой подход для безопасного доступа к свойствам:

(((body || {}).head || {}).eyes || [])[0] || 'левый глаз';

Здесь:

  1. body || {} — если body равно null или undefined, то вместо этого будет использован пустой объект {}.
  2. Аналогично, мы проверяем head и eyes, обеспечивая, что при отсутствии какого-либо свойства не произойдет ошибка, а вернется безопасное значение.
  3. || [] заменяет eyes на пустой массив, если он равен null или undefined, что позволяет избежать попытки обращения к первому элементу несуществующего массива.
  4. В конце, если первый элемент eyes равен undefined, будет возвращено значение по умолчанию 'левый глаз'.

Этот метод эффективен для работы с объектами, где некоторые свойства могут отсутствовать, и помогает избежать ошибок, возникающих при попытке доступа к свойствам null или undefined.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь