首頁  >  文章  >  web前端  >  JavaScript 更嚴格的等值 [譯]_javascript技巧

JavaScript 更嚴格的等值 [譯]_javascript技巧

WBOY
WBOY原創
2016-05-16 17:49:51964瀏覽
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的方法就是利用NaN是唯一一個與自身嚴格不相等的值:

複製代碼 代碼如下:

代碼如下:


代碼如下:

代碼如下: 代碼如下:

代碼如下:


function myIsNaN(value) {
return value !== value;
}

另外一個更容易懂的方法是在使用isNaN()之前先檢查一下這個值是不是數字類型.這樣就避免了隱式轉換的問題.


複製代碼 代碼如下: function myIsNaN2(value) {
return typeof value === 'number' && isNaN(value);
}


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


2.區分-0和0複製程式碼


程式碼如下:


> -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
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn