Во второй статье нашей серии, посвященной коротким, но приятным функциям, обсуждается проблема проверки пустых значений. Рассматриваемая функция называется empty()
Подобно функции PHP с тем же именем, она принимает переменную или свойство и сообщает вам, является ли значение пустым. Определение пустого
зависит от значения, о котором идет речь.
Функция PHP empty()
Например, 0
false
true
Наша функция JavaScript гораздо точнее о том, какие данные можно считать пустыми:
-
undefined
null
- строка нулевой длины
- массив без членов
- объект без перечисляемых свойств
Булевы числа и числа никогда не бывают пустыми, независимо от их значения. Вот код функции 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
Можно утверждать, что это условие не является необходимым, потому что, ну, просто не передавайте логические значения и числа! Но обеспечение такой гибкости означает, что вы можете передавать произвольные данные. Второе условие проверяет значение с undefined
null
Это может быть особенно полезно для установки значений по умолчанию для необязательных аргументов функции, как показано в следующем примере.
function doSomething(foo, bar)
{
if(empty(bar))
{
bar = 'default value';
}
}
Хотя значение null
undefined
Например, если вы запрашиваете объект веб-хранилища, используя синтаксис объекта, значение, которое не определено, будет undefined
getItem()
null
Третье условие в empty()
length
Это обнаружит пустые строки и массивы без членов. Я рассмотрел дополнительное условие, которое проверяет строки, которые являются пустыми или только пробелами. Этот тест показан ниже.
if(typeof(data.length) != 'undefined')
{
if(/^[\s]*$/.test(data.toString()))
{
return true;
}
return data.length == 0;
}
Я решил не включать предыдущую проверку, потому что она вносит двусмысленность. Вопрос о том, можно ли считать пустую строку только пробелом, зависит от мнения или конкретного приложения. Вместо этого я решил сохранить эту функцию как можно более понятной (в конце концов, мы не пишем PHP).
Конечное условие обрабатывает объекты, просматривая их и подсчитывая их перечисляемые элементы. Если это число равно нулю, то объект считается пустым.
Игнорирование несоответствующего
Благодаря тому, что конечное условие находится в конце, оно обрабатывает все, что проходит через него, включая функции, регулярные выражения, элементы и документы. Функции и регулярные выражения будут рассматриваться как пустые, потому что они обычно не имеют перечисляемых свойств. Элементы и документы не будут пустыми, потому что они имеют много свойств.
Это — двусмысленность, которую, возможно, стоит предотвратить, но в какой-то момент вы должны спросить себя: «Это действительно того стоит?». Подумайте о видах данных, которые вы, скорее всего, протестируете. Как правило, это будут простые переменные, массивы, словари, аргументы функций, значения форм, ответы Ajax, атрибуты и текстовые узлы; вряд ли это будет функция, регулярное выражение или поддерево DOM . Функция empty()