== 和 === 与隐式转化
# 两者的区别
===是严格比较,类型与值都相等才会返回true,==在类型不同的时候会进行隐式转化,转化后如果值相同,也会返回true。
# ==的类型隐式转化场景
当 x或者y为NaN的时候。这时候我们就用到了一句话,NaN跟谁都不等,包括他自己。
当x,y都为null, undefined的时候,不会进行类型转化,得到的结果都是true。
当x或y都为 string,boolean,number的时候,数据类型不一致的时候,会先转化成number在进行比较。
console.log( 1 == '1' );//true 1 == Number('1')
console.log( false == '0' );//true Number(false) == Number('0') 0 == 0
console.log( '' == 0); // true Number('') == 0
console.log( 1 === true) // true Number(true) == 1
console.log( false == 0 ) // true
1
2
3
4
5
6
2
3
4
5
6
- 当x或y存在引用类型的时候,会先转化成
原始值
,再进行比较;
引用类型转化原始值:会先调用对象的的valueOf()方法获取原始值,在调用toString()方法转化成字符串比较;
- valueOf:这里可以忽略,对象类型默认valueOf会返回自身。
- toString: 数组的toString方法本质是调用了join()转化成字符串,相信这样说大家都能理解了吧。 对象的toString返回的是固定的字符串
[object Object]
。
console.log( [10,20,30] == '10,20,30' );//true
console.log( [] == '' );//true
console.log( [] == 0 );//true (1) [].toString (2) '' == 0 (3) 0 == 0
console.log( {name:'张三'} == '[object Object]');//true
console.log( {} == '' );//false
console.log( {} == '[object Object]' );//true
console.log( {} == 0 );//false c
console.log( ![] == 0 );//true ![] == 0 是true,这里是隐式规则转布尔型! Boolean([]) = !true = false
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
注意 *
!运算符的优先级要高于比较运算符
- x,y都为引用类型的时候,这里比较的是地址;