31

Существует ли стандартная функция для проверки переменных на null, undefined или пустые значения в JavaScript?

39

Описание проблемы: Проверка значения переменной в JavaScript

Я столкнулся с задачей проверки переменной на наличие значения в JavaScript. Мне нужно убедиться, что переменная не является undefined, null или пустой строкой. Я разработал следующую функцию, но не уверен, охватывает ли она все возможные случаи:

function isEmpty(val) {
    return (val === undefined || val == null || val.length <= 0) ? true : false;
}

Хотелось бы получить универсальный подход к этой проблеме. Учитывает ли моя функция все возможные сценарии? И есть ли более эффективный способ реализации подобной проверки?

5 ответ(ов)

1

Функция isEmpty проверяет, является ли переданное значение "пустым". Исходная реализация выглядит так:

function isEmpty(value){
  return (value == null || value.length === 0);
}

Она вернёт true для следующих значений:

undefined  // Поскольку undefined == null

null

[]

""

Также это будет применимо и для функций без аргументов, так как length функции соответствует количеству объявленных параметров.

Если вы хотите исключить последний случай (функции), можно просто проверить на пустые строки:

function isEmpty(value){
  return (value == null || value === '');
}

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

function isEmpty(value){
  return (value == null || value.trim().length === 0);
}

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

0

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

if (typeof value !== 'undefined' && value) {
    // работаем со значением
}

Этот код охватывает случаи, когда value никогда не была определена, а также эти значения:

  • null
  • undefined (значение undefined не равно параметру, который никогда не был определён)
  • 0
  • "" (пустая строка)
  • false
  • NaN

Таким образом, таким образом вы можете безопасно работать с переменной, даже если она не была инициализирована.

0

Вот одно из решений, которое мне очень нравится:

Давайте определим, что пустая переменная — это null, undefined, или если у неё есть длина, то она равна нулю, или если это объект, то у него нет ключей:

function isEmpty(value) {
  return (
    // null или undefined
    (value == null) ||

    // имеет длину и она равна нулю
    (value.hasOwnProperty('length') && value.length === 0) ||

    // является объектом и не имеет ключей
    (value.constructor === Object && Object.keys(value).length === 0)
  );
}

Возвращает:

  • true: undefined, null, "", [], {}
  • false: true, false, 1, 0, -1, "foo", [1, 2, 3], { foo: 1 }
0

Вы можете найти полезной следующую функцию:

function typeOf(obj) {
  return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
}

Или в ES7 (прокомментируйте, если есть дальнейшие улучшения):

function typeOf(obj) {
  const { toString } = Object.prototype;
  const stringified = obj::toString();
  const type = stringified.split(' ')[1].slice(0, -1);

  return type.toLowerCase();
}

Результаты:

typeOf(); //undefined
typeOf(null); //null
typeOf(NaN); //number
typeOf(5); //number
typeOf({}); //object
typeOf([]); //array
typeOf(''); //string
typeOf(function () {}); //function
typeOf(/a/); //regexp
typeOf(new Date()); //date
typeOf(new WeakMap()); //weakmap
typeOf(new Map()); //map

Обратите внимание, что оператор привязки (::) не является частью ES2016 (ES7) и ни одной последующей версии стандарта ECMAScript. В настоящее время это предложение находится на стадии 0 (в стадии обсуждения) для введения в язык. – Симон Кьельберг. Автор высказывает свою поддержку этому прекрасному предложению, чтобы оно получило "королевское" одобрение.

0

Эта проверка условия

if (!!foo) {
    // foo определен
}

вполне достаточна.

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