同系列文章请查看:Github:pre-interview
相等性判断
概览
四种判断相等的方法:
- 全等:===
- 等于:==
- 零值相等:+0 === -0
- 同值相等:-0 !== +0、NaN === NaN
JavaScript中提供有关相等判断的操作方法:
- 严格相等: === Strict Equality
- 非严格(抽象相等/非约束) 相等:== Loose Equality
- Object.is(v1, v2) ES6:判断两个参数是否是同一个值
Loose(自由的,不受限制的)
严格相等
严格相等特性:
- 1)不进行隐式类型转换
- 2)类型、值相同
1 === ‘1’ false
1 === 2 false
- 3)引用值必须是同一地址
1 | var obj = {} |
- 4)NaN === NaN false
NaN 跟任何值都不相等
面试题:什么情况下 a !== a 成立?
答:a = NaN
- 5)+0 === -0 // true
- 6)+Infinity 与 -Infinity不相等(无穷)
Infinity === Infinity // true
面试题:什么情况下 a === a - 1 成立?
答:a = Infinity
非严格相等
Abstract equality
非严格相等特性:
- 1)隐式类型转换 - 等式两边都有可能被转换
- 2)转换以后还是用严格相等来进行比较
关于隐式类型转换在非严格相等中的比较规律详见 MDN:非严格相等
==
- 3)任何对象都与 undefined null 不相等
1 | // 测试 |
1 | ({}) === undefined // false |
补充:窄对象 Narrow Object -> document.all
1 document.all == undefined // true但是 ,
typeof document.all
打印出来为"undefined"
;
document.all
在IE中是Object对象,其他浏览器为"undefined"
,已废除。
- 4)非严格相等不一定比严格相等差
零值相等(same-value-zero)
+0 === -0
同值相等(same-value)
1)-0 !== +0
证明:
1 | var obj = {} |
2)NaN === NaN
用相同方法证明:
1 | Object.defineProperty(obj, 'myNaN', { |
注意:同值相等的底层实现是基于 Object.is()(ES6) 实现,ES5并没有暴露JS引擎的同值相等方法。
3)Object.is()
实现了同值相等
1 | var a = 1 |
1 | var a = +0 |
1 | var a = NaN |
1 | const res = Object.is(undefined, undefined) |
总结:Object.is()
参数为两个值,返回值为同值相等判断的bool结果,判断标准就是同值相等(-0 !== +0、NaN === NaN)。
与严格相等的区别:
- -0 !== +0
- NaN === NaN
与非严格相等的区别:
- 不进行隐式转换
手写 Object.is 方法
1 | Object.myIs = function (a, b) { |
Tips: Please indicate the source and original author when reprinting or quoting this article.