这是我在 JS Tips 上翻译的一篇文章,原文在官网上:www.jstips.co/zh_cn/javas…javascript
咱们都知道 JavasSript 是弱类型的,而且当咱们使用 '==' 做比较时,在一些状况下因为类型转换或者说“把两个操做数中的一个转换成另外一个,而后在比较”,会出现意想不到的结果。java
0 == ' ' //true
null == undefined //true
[1] == true //true复制代码
所以 JavaScript 中给咱们提供了全等操做符 '===', 它比不全等操做符更加严格而且不会发生类型转换。可是用 '===' 来进行比较并非最好的解决方案。你可能会获得:ui
NaN === NaN //false复制代码
好消息是 ES6 中提供了新的 'Object.is()' 方法,它具备 '===' 的一些特色,并且更好、更精确,在一些特殊案例中表现的很好:spa
Object.is(0 , ' '); //false
Object.is(null, undefined); //false
Object.is([1], true); //false
Object.is(NaN, NaN); //true复制代码
Mozilla 团队并不认为 Object.is 比 '===' 更加‘严格’,他们说咱们应该考虑的是这个方法如何处理 NaN, -0 和 +0。可是总的来讲, 我认为它在实际应用中是一个很好的实践。翻译
如今来看看这张图表的对比...3d
以上是原文的译文。
JS Tips 的风格就是简短,介绍一些小技巧,每篇的阅读时间要控制在 2 分钟之内。不够过瘾是吧?下面来点干货!附上 Object.is 的 polyfill:code
Object.is = function(x, y) {
if (x === y) {
// +0, -0 状况的处理
return x !== 0 || 1 / x === 1 / y;
} else {
// NaN
return x !== x && y !== y;
}
};复制代码