面试题中常见的数据类型陷阱【1】
* 首先明确一下js中常见的false值有:0,+0,-0,false,"",undefined,null,NaN.
我们平时这样说是在强制转换Boolean()或隐式转换情况下,所以正常情况下作比较,情况如下:
1 console.log(NaN==undefined); //false 2 console.log(NaN==false); //false 3 console.log(undefined==false); //false 4 console.log(null==false); //false
此时不存在隐式转换,所以为false。
但若在数字或字符类型进行比较时,js运行机制会将其隐式转换为Boolean类型:
1 console.log(false==""); //true
2 console.log(false==0) ; //true
但作为弱类型语言,js有着很多不符合常理的情况,我们称之为怪异行为:
console.log("0"==false); //true
console.log(Boolean("0")); //true
1 Boolean([]); //true 2 console.log([]==false); //true 3 console.log(null==undefined); //true
最后再说NaN,W3C的API中这样说NaN:
NaN 属性是代表非数字值的特殊值。该属性用于指示某个值不是数字。可以把 Number 对象设置为该值,来指示其不是数字值。
可以使用 isNaN() 全局函数来判断一个值是否是 NaN 值。
console.log(typeof NaN); //number
意思就是NaN就是一个量,他不是数字,但和数字同属于number类型。既然是一个非数字的量,那么它就不能比较:
console.log(NaN==NaN); //false console.log(NaN===NaN); //false console.log(NaN==false); //false console.log(NaN=="ABC"); //false