首页 » 性感的程序员 » [nodejs]空数组[]是true还是false

[nodejs]空数组[]是true还是false

var a=[];//定义一个数组
console.log (typeof(a));//object
if(a){
    console.log('a==true');
}
//a==true
if(a==true){
    console.log('a==true');
}else{
    console.log('a!=true');
}
//a!=true
if(a==false){
    console.log('a==false')
}else{
    console.log('a!=false');
}
//a==false

那么问题来了,到底[]等于不等于true呢?
根据查阅书籍《JavaScript高级程序设计》得知:
在流控制语句if()中,自动执行相应的Boolean()转换,并且数组属于的Object类型的任意对象转换为Boolean均为true,而Object类型中,只有null会转化为false.

所以在if(a)中,调用了Boolean()方法将a转化为了布尔值true,但是,在if(a==true)中,为什么a==true又是错的呢?
原来,任意值与布尔值比较,都会将两边的值转化为Number类型比较,此时,a转化为0,而true转化为1,atrue并不相等.

问题又来了:为什么a会转化为0呢?因为a是一个对象,如果对象具有valueOf()方法,那么在它转化为数字时,调用此方法,返回一个原始值,js将这个原始值转化为数字返回.否则,调用toString(),如果这两个方法都没有,那么报错.数组继承了对象默认的valueOf方法,但是数组调用此方法后,返回值为数组本身,所以,还会继续调用toString(),此时返回空字符串,转换为0.

总结:if(a),直接返回true.if(a==true),将a转化为0再比较.
因此确切地知道在流控制语句中使用的是什么变量至关重要.错误地使用一个对象而不是一个Boolean值,就有可能彻底改变应用程序的流程.

在此感谢captainblue