[譯]為什麼你應該在相等比較中使用 Object.is()

揹著燈籠發表於2017-04-06

這是我在 JS Tips 上翻譯的一篇文章,原文在官網上:www.jstips.co/zh_cn/javas…

我們都知道 JavasSript 是弱型別的,並且當我們使用 '==' 作比較時,在一些情況下由於型別轉換或者說“把兩個運算元中的一個轉換成另一個,然後在比較”,會出現意想不到的結果。

0 == ' ' //true
null == undefined //true
[1] == true //true複製程式碼

因此 JavaScript 中給我們提供了全等操作符 '===', 它比不全等操作符更加嚴格並且不會發生型別轉換。但是用 '===' 來進行比較並不是最好的解決方案。你可能會得到:

NaN === NaN //false複製程式碼

好訊息是 ES6 中提供了新的 'Object.is()' 方法,它具有 '===' 的一些特點,而且更好、更精確,在一些特殊案例中表現的很好:

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。但是總的來說, 我認為它在實際應用中是一個很好的實踐。

現在來看看這張圖表的對比...

[譯]為什麼你應該在相等比較中使用 Object.is()
differences of operators in equality comparisons javascript

以上是原文的譯文。
JS Tips 的風格就是簡短,介紹一些小技巧,每篇的閱讀時間要控制在 2 分鐘以內。不夠過癮是吧?下面來點乾貨!附上 Object.is 的 polyfill:

Object.is = function(x, y) {
  if (x === y) {
    // +0, -0 情況的處理
    return x !== 0 || 1 / x === 1 / y;
  } else {
    // NaN
    return x !== x && y !== y;
  }
};複製程式碼

參考

相關文章