看前记得先喝水,太干了
一、介绍
这里首先介绍一下三者所能做的
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的值
以上则是这三者之间的关系
感觉有帮到的可以心里默念一句“作者真帅!!!”