干货篇:==、===与Object.is()之间的关系

看前记得先喝水,太干了

一、介绍

这里首先介绍一下三者所能做的

1.==(会进行类型转换)

1).如果两边的值类型相同,则进行严格比较
2).如果两边的值类型不同,则进行类型转换(即隐式转换)后在进行比较
①如果有一边的值为数字类型(number),另一个操作数为字符串或布尔值,则会把字符串或布尔值转换为数字类型;
②如果有一边的值为对象,另一边为基本数据类型,则将对象转为原始值,在进行比较;

对象转原始值又包括两种,

一种是通过对象的内置对象valueOf(),优先调用valueOf方法,将对象转为基本类型,若当valueOf方法返回的不是基本类型时则调用toString()
另一种是通过对象的内置对象toString(),若又toString则调用,将对象转为字符串
③如果两边的值都为对象,则会将比较两边的地址

2.===(不会进行类型转换)

首先判断两边值的类型是否相等,如果不相等则直接返回false;
若相等,则判断两边的值是否相等

相较于==变得更加严格

注:NaN不等于任何值,包括NaN

3.Object.is()   (不会进行类型转换)

Object.is与===基本相同

但用过的朋友都知道,当进行以下判断时,返回的并不是我们所想的结果

console.log(Object.is(NaN,NaN))    //打印结果为true
console.log(Object.is(+0,-0))      //打印结果为false
console.log(Object.is(NaN,0/0))    //打印结果为true

当看到这里就会发现打印的结果与我们预期的结果相反,这时,我们就需要去看看Object.is()的具体内容了

Object.is = function(x, y) {
    if(x === y) {
        //当x、y为+0、-0时,会走这里,判断返回的结果为false
        return x !==0 || 1 / x === 1 ? y
    } else {
        //当x、y都为NaN时,会走这里,返回的结果为true;0/0的结果也为NaN(即第三种情况同左)
        return x !== x && y !== y
    }
}

从这里也可以分析出Object.is比===多连个点:

一个为可以进行正负号的判断(===也可以进行正负号的判断但相比较Object.is方法松一点点点)

另一个为Object.is方法会使NaN等于NaN,也可以理解为Object.is方法使NaN不等于非NaN的值

以上则是这三者之间的关系

感觉有帮到的可以心里默念一句“作者真帅!!!”

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值