Avatar ·

Как правильно проверить строку на пустое значение, null или undefined в JavaScript?

Всем привет! Я только начал изучать JavaScript и столкнулся с проблемой проверки строк. Мне нужно написать функцию, которая принимает строку и проверяет, является ли она пустой, null или undefined. Но я не уверен, как правильно это сделать, потому что в разных источниках вижу разные подходы. Вот пример моего кода: ```javascript function checkString(str) { if (str == null) { return 'Строка равна null или undefined'; } if (str === '') { return 'Строка пустая'; } return 'Строка не пустая'; } ``` Но я заметил, что это не всегда работает. Например, если передать число 0 или false, то условие `str == null` срабатывает некорректно. А что делать, если строка содержит только пробелы? Должна ли она считаться пустой? Также я читал, что некоторые используют `if (!str)`, но это проверяет все "ложные" значения (0, false, NaN), а не только пустую строку, null и undefined. Мне нужна именно проверка для строковых значений. Подскажите, пожалуйста, какой способ является наиболее правильным и надёжным? Желательно с примерами кода, чтобы я мог разобраться. <<>>

Правильный подход к проверке строки на пустоту, null и undefined

Ваша проблема очень распространена среди начинающих разработчиков. Дело в том, что в JavaScript есть несколько "ложных" (falsy) значений, и простое использование if (!str) может привести к неожиданным результатам. Давайте разберём правильные способы проверки.

1. Базовая проверка на null и undefined

Самый простой и безопасный способ — использовать строгое сравнение (===) или typeof:


function isEmptyString(str) {
  // Проверка на null и undefined
  if (str === null || str === undefined) {
    return true;
  }
  // Проверка на пустую строку
  if (str === '') {
    return true;
  }
  return false;
}

console.log(isEmptyString(''));        // true
console.log(isEmptyString(null));      // true
console.log(isEmptyString(undefined)); // true
console.log(isEmptyString('Hello'));   // false
console.log(isEmptyString(0));         // false (число не строка)

2. Универсальная проверка с учётом пробелов

Часто нужно считать строку, состоящую только из пробелов, пустой. Для этого используйте метод trim():


function isBlankString(str) {
  // Проверка на null/undefined с помощью оператора ?.
  if (str?.trim() === '' || str === null || str === undefined) {
    return true;
  }
  return false;
}

// Или более компактно:
const isBlank = (str) => str == null || str.trim() === '';

console.log(isBlankString('   '));    // true
console.log(isBlankString(''));       // true
console.log(isBlankString(null));     // true
console.log(isBlankString('abc'));    // false

3. Использование оператора нулевого слияния (??)

Современный подход — использовать ?? для обработки null/undefined и проверку длины строки:


function checkString(str) {
  // ?? возвращает правую часть только если слева null или undefined
  const safeStr = str ?? '';
  return safeStr.length === 0;
}

console.log(checkString(null));       // true
console.log(checkString(undefined));  // true
console.log(checkString(''));         // true
console.log(checkString('текст'));    // false

4. Полная функция для всех случаев

Вот универсальная функция, которая покрывает все сценарии:


function isStringEmpty(str) {
  // 1. Проверка типа: должна быть строка
  if (typeof str !== 'string') {
    return false; // или true, если нужно считать не-строки пустыми
  }
  // 2. Проверка на null/undefined (хотя typeof уже исключает)
  // 3. Проверка на пустоту с учётом пробелов
  return str.trim().length === 0;
}

// Примеры:
console.log(isStringEmpty(''));        // true
console.log(isStringEmpty('   '));     // true
console.log(isStringEmpty(null));      // false (не строка)
console.log(isStringEmpty('abc'));     // false

Важные моменты:

  • Всегда используйте строгое сравнение (===) вместо нестрогого (==), чтобы избежать приведения типов.
  • Проверяйте тип данных — если вы ожидаете строку, убедитесь, что это действительно строка через typeof.
  • Решите, нужно ли учитывать пробелы — для большинства бизнес-логик строка из пробелов считается пустой.
  • Используйте современные возможности — оператор опциональной цепочки (?.) и нулевого слияния (??) делают код чище.

Выберите подход, который соответствует вашей задаче. Для большинства случаев я рекомендую комбинацию str == null || str.trim() === '' — это кратко, понятно и надёжно.

<<>>

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

Если вы работаете в проекте, где уже используется библиотека Lodash, можно воспользоваться её методом _.isEmpty(). Однако будьте осторожны: он проверяет не только строки, но и другие типы данных.


// С Lodash
_.isEmpty('');        // true
_.isEmpty(null);      // true
_.isEmpty(undefined); // true
_.isEmpty('   ');     // false (пробелы не считаются пустыми)
_.isEmpty('abc');     // false

Если вы не хотите подключать целую библиотеку, можно создать свою небольшую утилиту:


const Utils = {
  isBlank: function(value) {
    return value == null || (typeof value === 'string' && value.trim() === '');
  },
  
  isPresent: function(value) {
    return !this.isBlank(value);
  }
};

console.log(Utils.isBlank(''));        // true
console.log(Utils.isBlank(null));      // true
console.log(Utils.isBlank('  '));      // true
console.log(Utils.isBlank('Hi'));      // false
console.log(Utils.isPresent('Hi'));    // true

Также помните, что если вы проверяете аргументы функции, можно задать значение по умолчанию через ?? или ||:


function greet(name) {
  const safeName = name ?? 'гость';
  if (safeName.trim() === '') {
    return 'Привет, аноним!';
  }
  return `Привет, ${safeName}!`;
}

console.log(greet(null));    // "Привет, гость!"
console.log(greet(''));      // "Привет, аноним!"
console.log(greet('Иван'));  // "Привет, Иван!"

Этот подход особенно полезен, когда вы пишете функции, которые должны корректно обрабатывать любые входные данные.