当你看到 [] == '' 也为 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 console.log( null == null );//true
console.log( undefined == undefined );//true
console.log( null == undefined );//true3.当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