JavaScript 更嚴格的相等 [譯]

來源:互聯網
上載者:User

1.檢測NaN
在數學上,任意值x總是與自己相等:

x = x

但這條規則並不適用於 === 和 NaN: 複製代碼 代碼如下:> NaN === NaN
false

導致的結果就是,你不能通過使用indexOf方法在一個包含了NaN的數組中找到這個NaN,因為該方法在內部是使用了===來判斷一個元素是否和參數中指定的值相等的: 複製代碼 代碼如下:> [ NaN ].indexOf(NaN)
-1

譯者注:switch語句同理 複製代碼 代碼如下:switch (NaN) {
case NaN:alert(NaN);
}

如果你不能使用 === 來檢測NaN,那該使用什麼呢?有一個全域函數isNaN(),但這個函數有個問題,就是它總會隱式的將參數中的值轉換成數字再做判斷,這樣就在判斷很多明顯不是NaN的值的時候也返回了true: 複製代碼 代碼如下:> isNaN("foo")
true

解釋:"foo"被轉換成了數字NaN. 複製代碼 代碼如下:> Number("foo")
NaN

另外一個檢測NaN的方法就是利用NaN是唯一一個與自身嚴格不相等的值: 複製代碼 代碼如下:function myIsNaN(value) {
return value !== value;
}

另外一個更易懂的方法是在使用isNaN()之前先檢查一下這個值是不是數字類型.這樣就避免了隱式轉換的問題. 複製代碼 代碼如下:function myIsNaN2(value) {
return typeof value === 'number' && isNaN(value);
}

ECMAScript.next中將會有一個新的Number.isNaN()方法,它是一個修正版的isNaN()函數.

2.區分-0和+0

這樣的需求很少見,但有時候你的確需要區分+0(正零)和-0(負零),在JavaScript中,這是兩個不同的值.但===不能判斷出來: 複製代碼 代碼如下:> -0 === +0
true

那到底該怎麼來區分呢?在JavaScript中.如果讓一個正數除以−0,結果是-Infinity.如果除以+0,則結果是Infinity.這兩個無窮大值是可以使用===來判斷的: 複製代碼 代碼如下:> 1 / -0
-Infinity

> 1 / +0
Infinity

> Infinity === -Infinity
false

譯者注:寫成函數就是 複製代碼 代碼如下:function isPositiveZero(zero){
return 1/zero === Infinity

}
function isNegativeZero(zero){
return 1/zero === -Infinity
}

3.ECMAScript.next中更嚴格的相等:“is”操作符

ECMAScript.next會有一個 “is” 操作符,它的作用就是"更嚴格的相等”:它能把NaN看作等於自身,還能區分開-0和+0.還有一個相反的操作符稱為“isnt”.例如:複製代碼 代碼如下:> NaN is NaN
true

> -0 isnt +0
true

目前這個操作符可以由Object.is()方法來彌補.這個方法可以這樣實現:

複製代碼 代碼如下:Object.is = function(x, y) {
if (x === y) {
// x === 0 => 比較+0和-0
return x !== 0 || (1/x === 1/y);
}

// x !== y => 只有在x和y都是NaN時才返回true
return x !== x && y !== y;
};

3.1 嘗試Object.is()

如果你想嘗試一下Object.is(),你可以使用es6-shim,它可以將ECMAScript.next(ECMAScript 6)中的一些特性移植到ECMAScript 5中.

譯者注:如果想在ES3的環境上使用,則還得使用es5-shim

4.參考

  1. Equality in JavaScript: === versus ==
  2. ECMAScript.next: the “TXJS” update by Eich
  3. NaN and Infinity in JavaScript
  4. es6-shim – ECMAScript 6 functionality on ECMAScript 5
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.