==和===的区别

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值