JS 不同数据类型的比较 是个头疼事情,那有没有规律可循,让记忆和理解起来更加容易呢,
console.log(1 == "1") //true
好的,我先把规则告诉大家,然后大家理解后再开始练习。看看效果是不是很显著;
类型 | 类型 | 其他说明 | 其他说明 |
对象 | 对象 | 比较是不是同一个内存地址 | |
对象 | 字符串 | 对象先转为字符串,在和字符串进行比较 | |
对象 | 布尔类型 | 两边都要先转为数值 false 是 0,true 是 1 对象类型先隐式调用toString()方法,然后在Number() | |
对象 | 数字 | 对象要转为数字,在进行比较(对象先隐式调用toString()方法转为字符串,然后在把字符串 转为数字使用Number()方法) | |
数字 | 布尔 | 布尔转成数字(false 是 0,true 是 1),在和数字进行比较 | |
数字 | 字符串 | 字符串转成数字使用Number()方法,在和数字进行比较 | |
布尔 | 数字/字符串 | 都转成数字在进行比较 | |
null | undefined | true | |
null/undefined | 其他类型 | 结果都是false | |
NaN | NaN | false |
自身做布尔运算的时候
之前文章说过,除了 "" 0 NaN null undefined false 为false, 其他都为true
//先执行![] 转成布尔 false 然后就变成了 布尔和对象比较 都转成数值
//false --> 0 [] -> '' -> 0
console.log(![] == [])// true
//地址空间比较 肯定不相等
console.log([]==[])// false
//![] 先转成false
console.log(![]==false);//true
//对象和字符串比较 对象转字符串 "[object Object]"
console.log({a:1}=="[object Object]")// true
//字符串转成数字(调用Number()) NaN
console.log("12px" == 12); //false
这里有条新的规则:切记! 切记!切记!
! : 会先把后面的值进行去布尔,然后再取反,最后比较