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