1、=== 逻辑全等运算符,不仅要值相等,还需要数据类型相等。(不允许进行强制类型转换);
【1】:不同类型的值进行比较
如果两个值得类型不同,直接返回false;
【2】:同一类型的基础类型值
同一类型的基础类型的值比较时,值相同就返回true,值不同则返回false
1 === 0x1 //true
上面代码比较十进制的1和十六进制的1,因为类型和值都相同,返回true;
需要注意的是,NAN和任何值都不相等(包括自身)。另外,+0 等于 -0 ;
【3】:复合值类型(引用数据类型)
两个复合值类型数据进行比较时,不是比较他们的值是否相等,而是比较他们是否指向同一个地址。
console.log({} === {} , {} == {}) ; //false false
console.log([] === [] , [] == []) ; //false false
console.log(function(){} === function(){},function(){} == function(){}) ; //false false
需要注意的是,大于和小于运算符比较的是值。
【4】:undefined和null
undefined和null与自身严格相等
console.log(undefined === undefined) ; // true
console.log(null === null) ; // true
console.log(undefined === null) ; // false
【5】:严格不相等运算符
!== :算法是先求严格相等运算符的结果,然后返回相反值;
2、==(抽象相等比较算法)比较之前会进行隐式类型转换
【1】:相同类型的值进行比较
和严格相等运算符完全一样。
【2】:原始类型的值(基础类型的值)
先转换成number类型在进行比较(string,number、true)
①:true会转换成1,false会转换成0
②:空字符串转换为0;
console.log(1 == true) ; //true 相等于1 === Number(true) ;
console.log(0 == false) ; //true 等同于0 === Number(false) ;
console.log(2 == true) ; //false 等同于2 === Nuumber(true) ;
console.log("true" == true) ; // false 等同于Number("true") === Number(true) ;
console.log("" == 0) ; // true 等同于Number("") === 0 ;
console.log("" == false) ; //true 等同于Number("") === Number(false) ;
console.log("1" == true) ; //true 等同于Number("1") === Number(true) ;
console.log("\n 123 \t" == 123) ; //true 等同于Number("\n 123 \t") === 123 ;字符串转换为数字时,省略前置和后置的空格。
【3】:引用数据类型和基础数据(null,undefined除外)类型比较
引用数据类型在和基础数据类型比较时,引用数据类型会转换为基础数据类型的值,再进行比较。
数组情况
console.log([1] == true) ; // true 等同于Number([1]) == 1
console.log([1] == 1 ) ; //true 等同于Number([1]) == Number(1)
console.log([1] == true ) ; //true 等同于Number([1]) == Number(1)
console.log(['1'] == true) ; //true 等同于Number(['1']) == 1
console.log(['1'] == 1) ; //true 等同于Number(['1']) == Number(1)
console.log(['1'] == true) ; //true 等同于Number(['1']) == Number(1)
对象情况
对对象执行ToPrimitive操作:这步是JS解释器执行的,ToPrimitive方法的实现,是依次去调用对象的ValueOf,toString方法,直到其中一个方法返回一个基本值,然后比较返回的基本值和另一个基本数据类型的值进行比较。如果两个方法都没有返回基本值,那就认定false
【4】:undefined和null
undefined和null与其他类型的值比较时,结果都是false,它们互相比较时结果为true。
绝大多数情况下,对象和undefined、null比较,都返回false。只有在对象转为原始值得到undefined时,才会返回false,这种情况是非常罕见的。
【5】:特殊情况
Infinity只和自身比较返回true。
{}和任何值比较都返回false,{}的valueOf和toSring方法返回都是对象;Number({})返回NAN;
NAN和任何值比较都是false,包括自己。
参考文档: https://www.jianshu.com/p/68c4e15fd936