javascript 空值
本系列的第二篇文章介绍了简短但精巧的函数,讨论了测试空值的问题。 有问题的函数称为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
,但就许多意图和目的而言,它们等同于同一件事(即,这段数据没有想要的值)。 例如,如果使用对象语法查询Web存储对象,则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()
函数在精确评估与不浪费时间测试每种可能的可能性之间走出一条细线。
javascript 空值