Статьи

Тест на пустые значения в Javascript

Во второй статье нашей серии, посвященной коротким, но приятным функциям, обсуждается проблема проверки пустых значений. Рассматриваемая функция называется empty() Подобно функции PHP с тем же именем, она принимает переменную или свойство и сообщает вам, является ли значение пустым. Определение пустого зависит от значения, о котором идет речь.

Функция PHP empty() Например, 0falsetrue Наша функция JavaScript гораздо точнее о том, какие данные можно считать пустыми:

  • undefinednull
  • строка нулевой длины
  • массив без членов
  • объект без перечисляемых свойств

Булевы числа и числа никогда не бывают пустыми, независимо от их значения. Вот код функции empty()

 function empty(data)
{
  if(typeof(data) == 'number' || typeof(data) == 'boolean')
  { 
    return false; 
  }
  if(typeof(data) == 'undefined' || data === null)
  {
    return true; 
  }
  if(typeof(data.length) != 'undefined')
  {
    return data.length == 0;
  }
  var count = 0;
  for(var i in data)
  {
    if(data.hasOwnProperty(i))
    {
      count ++;
    }
  }
  return count == 0;
}

Как работает функция

Вы можете видеть, что для тестирования разных типов данных используются четыре условия. Первый из них имеет дело с логическими значениями и числами и всегда возвращает false Можно утверждать, что это условие не является необходимым, потому что, ну, просто не передавайте логические значения и числа! Но обеспечение такой гибкости означает, что вы можете передавать произвольные данные. Второе условие проверяет значение с undefinednull Это может быть особенно полезно для установки значений по умолчанию для необязательных аргументов функции, как показано в следующем примере.

 function doSomething(foo, bar)
{
  if(empty(bar))
  {
    bar = 'default value';
  }
}

Хотя значение nullundefined Например, если вы запрашиваете объект веб-хранилища, используя синтаксис объекта, значение, которое не определено, будет undefinedgetItem()null

Третье условие в empty()length Это обнаружит пустые строки и массивы без членов. Я рассмотрел дополнительное условие, которое проверяет строки, которые являются пустыми или только пробелами. Этот тест показан ниже.

 if(typeof(data.length) != 'undefined')
{
  if(/^[\s]*$/.test(data.toString()))
  {
    return true;
  }
  return data.length == 0;
}

Я решил не включать предыдущую проверку, потому что она вносит двусмысленность. Вопрос о том, можно ли считать пустую строку только пробелом, зависит от мнения или конкретного приложения. Вместо этого я решил сохранить эту функцию как можно более понятной (в конце концов, мы не пишем PHP).

Конечное условие обрабатывает объекты, просматривая их и подсчитывая их перечисляемые элементы. Если это число равно нулю, то объект считается пустым.

Игнорирование несоответствующего

Благодаря тому, что конечное условие находится в конце, оно обрабатывает все, что проходит через него, включая функции, регулярные выражения, элементы и документы. Функции и регулярные выражения будут рассматриваться как пустые, потому что они обычно не имеют перечисляемых свойств. Элементы и документы не будут пустыми, потому что они имеют много свойств.

Это — двусмысленность, которую, возможно, стоит предотвратить, но в какой-то момент вы должны спросить себя: «Это действительно того стоит?». Подумайте о видах данных, которые вы, скорее всего, протестируете. Как правило, это будут простые переменные, массивы, словари, аргументы функций, значения форм, ответы Ajax, атрибуты и текстовые узлы; вряд ли это будет функция, регулярное выражение или поддерево DOM . Функция empty()