JavaScript 更嚴格的相等 [譯]
更新時間:2012年09月20日 23:00:24 作者:
大部分JavaScript程序員都知道:應(yīng)該使用嚴格相等(===)來代替“普通”的相等操作(==).但是,有時候你的確需要一個比嚴格相等===更嚴格的運算符,比如說:在你想檢查某個值是否是NaN的時候,又或者你想?yún)^(qū)分-0和+0的時候.本文解釋了相關(guān)的知識以及ECMAScript.next中的解決辦法:“is”操作符
1.檢測NaN
在數(shù)學(xué)上,任意值x總是與自己相等:
x = x
但這條規(guī)則并不適用于 === 和 NaN:
> NaN === NaN
false
導(dǎo)致的結(jié)果就是,你不能通過使用indexOf方法在一個包含了NaN的數(shù)組中找到這個NaN,因為該方法在內(nèi)部是使用了===來判斷一個元素是否和參數(shù)中指定的值相等的:
> [ NaN ].indexOf(NaN)
-1
譯者注:switch語句同理
switch (NaN) {
case NaN:alert(NaN);
}
如果你不能使用 === 來檢測NaN,那該使用什么呢?有一個全局函數(shù)isNaN(),但這個函數(shù)有個問題,就是它總會隱式的將參數(shù)中的值轉(zhuǎn)換成數(shù)字再做判斷,這樣就在判斷很多明顯不是NaN的值的時候也返回了true:
> isNaN("foo")
true
解釋:"foo"被轉(zhuǎn)換成了數(shù)字NaN.
> Number("foo")
NaN
另外一個檢測NaN的方法就是利用NaN是唯一一個與自身嚴格不相等的值:
function myIsNaN(value) {
return value !== value;
}
另外一個更易懂的方法是在使用isNaN()之前先檢查一下這個值是不是數(shù)字類型.這樣就避免了隱式轉(zhuǎn)換的問題.
function myIsNaN2(value) {
return typeof value === 'number' && isNaN(value);
}
ECMAScript.next中將會有一個新的Number.isNaN()方法,它是一個修正版的isNaN()函數(shù).
2.區(qū)分-0和+0
這樣的需求很少見,但有時候你的確需要區(qū)分+0(正零)和-0(負零),在JavaScript中,這是兩個不同的值.但===不能判斷出來:
> -0 === +0
true
那到底該怎么來區(qū)分呢?在JavaScript中.如果讓一個正數(shù)除以−0,結(jié)果是-Infinity.如果除以+0,則結(jié)果是Infinity.這兩個無窮大值是可以使用===來判斷的:
> 1 / -0
-Infinity
> 1 / +0
Infinity
> Infinity === -Infinity
false
譯者注:寫成函數(shù)就是
function isPositiveZero(zero){
return 1/zero === Infinity
}
function isNegativeZero(zero){
return 1/zero === -Infinity
}
3.ECMAScript.next中更嚴格的相等:“is”操作符
ECMAScript.next會有一個 “is” 操作符,它的作用就是"更嚴格的相等”:它能把NaN看作等于自身,還能區(qū)分開-0和+0.還有一個相反的操作符稱為“isnt”.例如:
> NaN is NaN
true
> -0 isnt +0
true
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()
在數(shù)學(xué)上,任意值x總是與自己相等:
x = x
但這條規(guī)則并不適用于 === 和 NaN:
復(fù)制代碼 代碼如下:
> NaN === NaN
false
導(dǎo)致的結(jié)果就是,你不能通過使用indexOf方法在一個包含了NaN的數(shù)組中找到這個NaN,因為該方法在內(nèi)部是使用了===來判斷一個元素是否和參數(shù)中指定的值相等的:
復(fù)制代碼 代碼如下:
> [ NaN ].indexOf(NaN)
-1
譯者注:switch語句同理
復(fù)制代碼 代碼如下:
switch (NaN) {
case NaN:alert(NaN);
}
如果你不能使用 === 來檢測NaN,那該使用什么呢?有一個全局函數(shù)isNaN(),但這個函數(shù)有個問題,就是它總會隱式的將參數(shù)中的值轉(zhuǎn)換成數(shù)字再做判斷,這樣就在判斷很多明顯不是NaN的值的時候也返回了true:
復(fù)制代碼 代碼如下:
> isNaN("foo")
true
解釋:"foo"被轉(zhuǎn)換成了數(shù)字NaN.
復(fù)制代碼 代碼如下:
> Number("foo")
NaN
另外一個檢測NaN的方法就是利用NaN是唯一一個與自身嚴格不相等的值:
復(fù)制代碼 代碼如下:
function myIsNaN(value) {
return value !== value;
}
另外一個更易懂的方法是在使用isNaN()之前先檢查一下這個值是不是數(shù)字類型.這樣就避免了隱式轉(zhuǎn)換的問題.
復(fù)制代碼 代碼如下:
function myIsNaN2(value) {
return typeof value === 'number' && isNaN(value);
}
ECMAScript.next中將會有一個新的Number.isNaN()方法,它是一個修正版的isNaN()函數(shù).
2.區(qū)分-0和+0
這樣的需求很少見,但有時候你的確需要區(qū)分+0(正零)和-0(負零),在JavaScript中,這是兩個不同的值.但===不能判斷出來:
復(fù)制代碼 代碼如下:
> -0 === +0
true
那到底該怎么來區(qū)分呢?在JavaScript中.如果讓一個正數(shù)除以−0,結(jié)果是-Infinity.如果除以+0,則結(jié)果是Infinity.這兩個無窮大值是可以使用===來判斷的:
復(fù)制代碼 代碼如下:
> 1 / -0
-Infinity
> 1 / +0
Infinity
> Infinity === -Infinity
false
譯者注:寫成函數(shù)就是
復(fù)制代碼 代碼如下:
function isPositiveZero(zero){
return 1/zero === Infinity
}
function isNegativeZero(zero){
return 1/zero === -Infinity
}
3.ECMAScript.next中更嚴格的相等:“is”操作符
ECMAScript.next會有一個 “is” 操作符,它的作用就是"更嚴格的相等”:它能把NaN看作等于自身,還能區(qū)分開-0和+0.還有一個相反的操作符稱為“isnt”.例如:
復(fù)制代碼 代碼如下:
> NaN is NaN
true
> -0 isnt +0
true
目前這個操作符可以由Object.is()方法來彌補.這個方法可以這樣實現(xiàn):
復(fù)制代碼 代碼如下:
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的環(huán)境上使用,則還得使用es5-shim
4.參考相關(guān)文章
JavaScript實現(xiàn)網(wǎng)頁跨年倒計時
這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)網(wǎng)頁跨年倒計時,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-12-12用JavaScript實現(xiàn)類似于ListBox功能示例代碼
這篇文章主要介紹了用JavaScript實現(xiàn)類似于ListBox功能,需要的朋友可以參考下2014-03-03JS獲得選取checkbox整行數(shù)據(jù)的方法
這篇文章主要介紹了JS獲得選取checkbox整行數(shù)據(jù)的方法,涉及使用js對DOM節(jié)點的操作技巧,非常具有實用價值,需要的朋友可以參考下2015-01-01