[譯]爲何你應該在相等比較中使用 Object.is()

這是我在 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

differences of operators in equality comparisons javascript

以上是原文的譯文。
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;
  }
};複製代碼

參考

相關文章
相關標籤/搜索