Avatar ·

Как проверить, является ли переменная undefined или null в JavaScript?

Всем привет! Я новичок в JavaScript и часто путаюсь с проверкой переменных на `undefined` и `null`. У меня есть код, который иногда выдаёт ошибки, и я не могу понять, почему. Вот пример: ```javascript let user; console.log(user); // undefined let data = null; console.log(data); // null function processValue(value) { if (value == undefined) { console.log('Значение не определено'); } else { console.log('Значение есть: ' + value); } } processValue(user); // 'Значение не определено' processValue(data); // 'Значение не определено' ``` В этом коде я использую `== undefined`, и это работает и для `undefined`, и для `null`. Но я слышал, что так делать неправильно, и нужно использовать строгое сравнение `===`. Если я заменю на `=== undefined`, то `null` уже не будет ловиться. А если на `=== null`, то не ловится `undefined`. Подскажите, пожалуйста, как правильно и безопасно проверять, является ли переменная `undefined` или `null`? Есть ли универсальный способ? И в чём вообще разница между этими двумя значениями? Заранее спасибо за помощь! <<>>

Краткий ответ: используйте строгую проверку или комбинированный подход

В JavaScript лучший способ проверить, является ли переменная undefined или null — это использовать строгую проверку с === для каждого случая отдельно, либо универсальную проверку через x == null (но с пониманием её особенностей).

Почему не стоит использовать == undefined?

Оператор == выполняет нестрогое сравнение с приведением типов. По спецификации JavaScript, null == undefined возвращает true. Поэтому value == undefined работает и для null, и для undefined. Но проблема в том, что это неочевидно для других разработчиков и может привести к путанице. Кроме того, == может давать неожиданные результаты с другими значениями (например, false == undefined — это false, но false == 0 — true).

Лучшие практики

1. Раздельная строгая проверка (рекомендуется для ясности)

if (value === null || value === undefined) {
  console.log('Значение null или undefined');
} else {
  console.log('Значение определено: ' + value);
}

Плюсы: Понятно, что проверяется. Нет неожиданных приведений типов.

Минусы: Немного многословно.

2. Универсальная проверка через == null (компактно, но с осторожностью)

if (value == null) {
  console.log('Значение null или undefined');
} else {
  console.log('Значение определено: ' + value);
}

Важно: value == null возвращает true только для null и undefined. Никакие другие значения (0, пустая строка, false) не попадут под это условие. Это единственный случай, когда использование == считается приемлемым в современном JavaScript.

3. Проверка на undefined через typeof (для необъявленных переменных)

if (typeof value === 'undefined') {
  console.log('Переменная undefined или не объявлена');
}

Этот способ единственный, который не вызовет ошибку ReferenceError, если переменная вообще не была объявлена. Однако он не ловит null.

Разница между undefined и null

  • undefined — значение по умолчанию для неинициализированных переменных или отсутствующего свойства объекта. Означает "значение ещё не присвоено".
  • null — явно задаваемое значение, которое означает "здесь нет объекта" или "значение намеренно отсутствует". Обычно используется программистом.

Практический пример

function getUser(id) {
  // Представим, что мы ищем пользователя в базе
  const user = findUserInDB(id);
  if (user === null) {
    // Пользователь не найден — явно возвращаем null
    return null;
  }
  return user;
}

const result = getUser(123);
if (result == null) {
  console.log('Пользователь не найден или произошла ошибка');
} else {
  console.log('Имя пользователя: ' + result.name);
}

Итог

Для большинства случаев используйте:

  • value === null || value === undefined — если важна читаемость и строгость.
  • value == null — если хотите компактный код и уверены, что переменная объявлена.
  • typeof value === 'undefined' — если есть риск, что переменная не объявлена.

Избегайте == undefined в пользу явных проверок — это сделает ваш код более предсказуемым.

<<>>

Альтернативный подход: использование оператора нулевого слияния (??)

В современном JavaScript (ES2020+) появился оператор нулевого слияния ??, который позволяет обрабатывать null и undefined более элегантно. Он возвращает правый операнд, только если левый равен null или undefined.

const value = null;
const result = value ?? 'Значение по умолчанию';
console.log(result); // 'Значение по умолчанию'

const anotherValue = 0;
const anotherResult = anotherValue ?? 'По умолчанию';
console.log(anotherResult); // 0 (не заменяется, так как 0 не null/undefined)

Это удобно для установки значений по умолчанию, когда нужно отличать null/undefined от других "ложных" значений (0, '', false).

Проверка через логическое НЕ (!)

Иногда можно встретить проверку if (!value). Она сработает для null, undefined, 0, '', false, NaN. Это не подходит, если нужно отличить именно null/undefined от других "ложных" значений. Используйте только если вам всё равно на эти различия.

Рекомендация

Для простой проверки используйте == null, а для установки значений по умолчанию — ??. Это современный и безопасный подход.