[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
,a
与true
并不相等.
问题又来了:为什么a
会转化为0
呢?因为a
是一个对象,如果对象具有valueOf()
方法,那么在它转化为数字时,调用此方法,返回一个原始值,js将这个原始值转化为数字返回.否则,调用toString()
,如果这两个方法都没有,那么报错.数组继承了对象默认的valueOf
方法,但是数组调用此方法后,返回值为数组本身,所以,还会继续调用toString()
,此时返回空字符串,转换为0
.
总结:if(a)
,直接返回true.if(a==true)
,将a
转化为0
再比较.
因此确切地知道在流控制语句中使用的是什么变量至关重要.错误地使用一个对象而不是一个Boolean
值,就有可能彻底改变应用程序的流程.
在此感谢captainblue