数据比较 == 和 === 与隐式转化

377 阅读2分钟
当你看到 [] == ![] 结果是true的时候是不是很头大。

当你看到 [] == '' 也为 true的时候是不是一脸茫然。

 别慌,下面就为你解决一番令你蛋疼的问题。

 在数据比较的时候,有全等运算符(===)和比较运算符(==),全等运算符就不多啰嗦了,接下来就详细讲解一下 == 的问题。

数据类型有以下几种: null, undefined, Boolean, number, Object, string;

这么多的数据类型在一起比较,看起来就头皮发麻,别急下面我们就来一一总结。

我们用 x, y 来代表两种数据 

1. 当 x或者y为NaN的时候。这时候我们就用到了一句话,NaN跟谁都不等,包括他自己。

console.log( NaN == 0 );//false
console.log( NaN == undefined );//false
console.log( NaN == null );//false
console.log( NaN == NaN );//false

2. 当x,y都为null, undefined的时候,不会进行类型转化,得到的结果都是true。

 console.log( null == null );//true 
console.log( undefined == undefined );//true 
console.log( null == undefined );//true

3.当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 

4.当x或y存在引用类型的时候,会先转化成‘原始值’,再进行比较;

引用类型转化原始值:会先调用对象的的valueOf()方法获取原始值,在调用toString()方法转化成字符串比较;

valueOf:这里可以忽略,对象类型默认valueOf会返回自身。对于这个方法在这里不做解释,有兴趣的同学可以查阅一下。www.cnblogs.com/xiaohuochai…

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
onsole.log( ![] == 0 );//true   这里下面会单独讲一下

* !运算符的优先级要高于比较运算符

![] == 0 是true,这里是隐式规则转布尔型! Boolean([]) = !true = false

 ![] 是逻辑非表达式的结果 和0 进行比较 不会调用 toString()方法;

5.x,y都为引用类型的时候,这里比较的是地址;

  var arr1 = [10,20,30];      
  var arr2 = arr1;//拷贝地址 赋值      
  var arr3 = [10,20,30];        //虽然arr1 arr2 arr3打印的时候,一模一样的。但是他们对应的堆地址不同        console.log(arr1 == arr2);//true        console.log(arr1 == arr3);//false        console.log(arr2 == arr3);//false


 console.log( ![] == [] );//true   
 console.log( ![] == ![] );//true  两个逻辑非表达式比较  !true == !true   false == false
 console.log( !{} ==  {} );//false  !{} == false {}转化原始值 调用toString()是 '[object Object]' false '[object Object]' 符合第三种类型 转化为数字 0 和NaN