НейроАгент

Как проверить переменную JavaScript на undefined или null

Узнайте правильные способы проверки переменных JavaScript на undefined или null. Узнайте, почему сравнение со строкой 'undefined' не работает, и получите работающие примеры кода для проверки null в JavaScript.

Вопрос

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

Я пытаюсь определить, является ли переменная undefined или null в моем JavaScript коде, но я столкнулся с проблемой, когда интерпретатор прерывает выполнение. Вот мой текущий код:

javascript
var EmpName = $("div#esd-names div#name").attr('class');
if(EmpName == 'undefined'){
  // DO SOMETHING
};

И соответствующий HTML:

html
<div id="esd-names">
  <div id="name"></div>
</div>

Какой правильный способ проверить, является ли переменная undefined или null в JavaScript, и почему мой текущий подход вызывает прерывание выполнения интерпретатора?

НейроАгент

В JavaScript есть несколько способов правильно проверить, является ли переменная undefined или null. Проблема вашего текущего подхода заключается в том, что вы сравниваете со строкой 'undefined', а не проверяете фактическое значение undefined, которое возвращает jQuery, когда атрибут не существует.

Правильный способ проверить наличие и undefined, и null - использовать строгое равенство или оператор двойного равенства, так как оба значения считаются “нулевыми” (nullish) в JavaScript:

javascript
var EmpName = $("div#esd-names div#name").attr('class');

// Метод 1: Проверка на undefined и null одновременно
if (EmpName == null) {
  // Это обрабатывает и undefined, и null
}

// Метод 2: Явные проверки
if (EmpName === undefined || EmpName === null) {
  // Это обрабатывает оба значения отдельно
}

// Метод 3: Использование typeof только для проверки undefined
if (typeof EmpName === 'undefined' || EmpName === null) {
  // Отдельные проверки
}

Ваш текущий код if(EmpName == 'undefined') сравнивает фактическое значение undefined (возвращаемое jQuery) со строкой 'undefined', что возвращает false. Интерпретатор может останавливаться из-за ошибки в другом месте вашего кода или потому, что jQuery в определенных контекстах может вызывать ошибку.

Содержание

Понимание undefined и null в JavaScript

В JavaScript undefined и null - это два различных примитивных значения, которые представляют отсутствие осмысленного значения:

  • undefined: Примитивное значение, которое автоматически присваивается переменным, которые были объявлены, но не инициализированы, или параметрам функций, которые не были предоставлены
  • null: Примитивное значение, которое явно представляет намеренное отсутствие любого объектного значения
javascript
let declaredButNotAssigned; // undefined
let intentionalNull = null; // null

Правильные методы проверки undefined и null

Метод 1: Двойное равенство (==) - Наиболее распространенный

javascript
if (variable == null) {
  // Обрабатывает и undefined, и null
  // так как undefined == null возвращает true
}

Это наиболее лаконичный и часто используемый метод, так как и undefined, и null нестрого равны null.

Метод 2: Строгое равенство (===) - Явные проверки

javascript
if (variable === undefined || variable === null) {
  // Явно проверяет оба значения
}

Этот метод более многословный, но делает очевидным, что вы проверяете оба условия.

Метод 3: Оператор typeof

javascript
if (typeof variable === 'undefined' || variable === null) {
  // Сначала проверяет undefined, затем null
}

Оператор typeof безопасен для использования даже с необъявленными переменными (в отличие от прямого сравнения).

Метод 4: Логическое ИЛИ

javascript
if (!variable) {
  // Это также обрабатывает undefined, null, false, 0, '', NaN
}

Будьте осторожны с этим подходом, так как он treats многие “ложные” значения одинаково.

Почему ваш текущий подход не работает

Ваш код if(EmpName == 'undefined') не работает по следующим причинам:

  1. Метод .attr('class') jQuery возвращает undefined, когда атрибут не существует, а не строку 'undefined'
  2. Сравнение undefined == 'undefined' возвращает false, так как это разные типы
  3. Вам следует сравнивать с фактическим значением undefined, а не со строкой

Вот что происходит:

javascript
// Ваш текущий подход
var EmpName = $("div#esd-names div#name").attr('class'); // Возвращает undefined
if(EmpName == 'undefined'){ // undefined == 'undefined' → false
  // Этот блок никогда не выполняется
}

// Правильный подход
if(EmpName == null){ // undefined == null → true
  // Этот блок выполняется
}

Интерпретатор может останавливаться из-за:

  • Ошибки в другой части вашего кода
  • jQuery, вызывающего ошибку в определенных контекстах
  • Синтаксической ошибки в другом месте

Лучшие практики для проверки на null

1. Используйте двойное равенство для проверки на nullish значения

javascript
function processValue(value) {
  if (value == null) {
    console.log('Значение равно null или undefined');
    return defaultValue;
  }
  return processActualValue(value);
}

2. Предоставляйте значения по умолчанию

javascript
// Использование нулевого оператора объединения (ES2020)
const EmpName = $("div#esd-names div#name").attr('class') ?? 'default-class';

// Использование логического ИЛИ
const EmpName = $("div#esd-names div#name").attr('class') || 'default-class';

3. Проверяйте перед доступом к свойствам

javascript
// Безопасный доступ к свойствам
if (obj && obj.prop) {
  // obj.prop существует
}

// Современный подход с опциональной цепочкой
if (obj?.prop) {
  // obj.prop существует, если obj не равен null/undefined
}

Современные решения JavaScript

Опциональная цепочка (ES2020)

javascript
const EmpName = $("div#esd-names div#name")?.attr('class');
if (EmpName == null) {
  // Обработка null/undefined
}

Нулевое объединение (ES2020)

javascript
const EmpName = $("div#esd-names div#name").attr('class') ?? 'default-value';

Безопасность доступа к объектам

javascript
const safeAccess = (obj, path) => {
  return path.split('.').reduce((acc, key) => {
    return (acc && acc[key]) !== undefined ? acc[key] : undefined;
  }, obj);
};

// Использование
const value = safeAccess(obj, 'nested.property');

Распространенные ошибки и решения

Ошибка 1: Сравнение со строкой ‘undefined’

javascript
// Неправильно
if (variable == 'undefined') { /* никогда не работает */ }

// Правильно
if (variable == null) { /* обрабатывает оба случая */ }

Ошибка 2: Забыть проверить на null

javascript
// Неправильно - проверяет только undefined
if (typeof variable === 'undefined') { /* пропускает null */ }

// Правильно - проверяет оба
if (variable == null) { /* обрабатывает оба */ }

Ошибка 3: Использование преобразования в Boolean

javascript
// Проблематично - treats многие ложные значения одинаково
if (!variable) { /* также ловит 0, false, '', NaN */ }

// Лучше - проверяет только nullish значения
if (variable == null) { /* только undefined и null */ }

Для вашего конкретного случая с jQuery правильным подходом будет:

javascript
var EmpName = $("div#esd-names div#name").attr('class');

// Лучшее решение для вашего случая
if (EmpName == null) {
  // Обработка случая, когда атрибут class не существует
  console.log('Атрибут class не найден');
  // ДЕЛАЙТЕ ЧТО-ТО
}

// Или предоставьте значение по умолчанию
const className = EmpName ?? 'default-class';

Этот подход правильно обработает и undefined (когда атрибут не существует), и null (если jQuery по какой-то причине возвращает null), предотвращая остановку выполнения интерпретатора из-за неожиданных значений.