Javascript基础纪要:常见的真假值

本文属于《Javascript基础纪要》系列

题目是个非常重要的问题,很多高手都会在判断真与假值上出错。比如:

1
2
3
function fn(a) {
    if(a) alert('has value');
}

这个函数是本来打算是:如果有参数a,则alert。这个函数可有bug?

bug老大了!!比如我传个0进去,参数a已经有了,但不会弹窗,因为0==false

所以,大家使用if的时候,要明白他的意思不是“如果有”,而是“如果..为真”,这是个很基础但绝对不能大意的概念。

常见的false值:

false,0,”,null,undefined

这些没什么好说的,我要说的是有几个“看起来像是false实际上不是”的东西:

空数组,空对象(也包括空函数),’ ‘(只有一个空格的字符串),’0’(只有一个0的字符串),’null’,’undefined’

上面这些,实际上都是true。

但是,如果把它们与true对等,又会得出相反的结果:

1
2
3
4
5
6
console.log(true==[]); // false
console.log(true==' '); // false
console.log(true=='0'); // false
console.log(true=='null'); // false
console.log(true=='undefined'); // false
console.log(true=={}); // false

也就是他们都不会==true,但实际上他们的确是真值。造成上面判断失败的原因,是数据类型自动转换的问题,而if()的时候,是不做转换的,所以该是真值是就是真。

可以通过如下来判断:

1
2
3
4
// 只试验一个[],其余的自行测试
if([]){
    alert(true)
}

接下来,就列举一些常用的真假值判断

判断是否传了参数

这个很简单,比如参数名叫a , 则 a!=undefined则表示a是有值的,即使可能是0,”,但就是有值

判断数组是否为空

最高效的方法是判断数组是否有长度:array.length>0,或直接:if(array.length),当他有长度时,他就不是空数组了。

判断对象是否为空

这个就有些困难了。简单的办法是判断对象中你需要的值,如o.b == undefined,而不是直接判断对象。如果迫不得已必须直接判断对象,要使用如下的这个函数:

1
2
3
4
5
6
function isEmpty( o ) {
    for ( var p in o ) {
        if ( o.hasOwnProperty( p ) ) { return false; }
    }
    return true;
}

比较麻烦吧?而且如果此对象从原型中继承了属性,这个判断的效率也就会降低。

判断空字符串

这个其实很简单,只是你要明白一点:你想要的空字符串,是指没有任何内容的字符串,还是即使有个空格也算是空字符串?所以你最好对字符串进行去除首尾空格的操作,然后再判断他是不是没有任何内容。

而’null’,’0’等这些字符串,基本上已经和空字符串毫无关系了,你不应该认为他们表示false。

----------总结-------------

实际上,真假值的判断是很简单的,关键就在于不要想当然,比如认为空数组就一定是假值,认为空格在字符串里表示假值,多做测试多记录,就不会出现莫名其妙的问题了。

发表评论

电子邮件地址不会被公开。