2013-06-25 47 views
4

在Javascript中:如何測試是否有相同的NaN?

NaN === NaN; // false 

我試圖確定什麼時候isNaN(foo)不只是相當於+foo 「是」 NaN。但我不知道如何判斷什麼是NaN除非使用isNaN,這對於很多事情,沒有一個=== NaN的回答是肯定的。

所以我認爲這樣做是正確的方式來解決其他的可能性:

typeof NaN === 'number' // true 

所以我覺得

typeof(foo) === 'number' && isNaN(foo) 

是最接近我在想什麼的。這很有意義,因爲NaN將是唯一不是數字的數字,或者是某種意義。這是正確的,這是最好的方式嗎?

+2

這會幫助 - http://stackoverflow.com/questions/10094738/javascript-logic-for-isn – lifetimes

+1

確實如此。我投來重新打開舊的現在,但有時這些東西可能需要一段時間.. – lifetimes

+0

@djechlin:我關閉它的這個重複,因爲這是一個更多的信息,是的。如果有人修復了另外一個(因爲OP似乎早已不復存在),可以圍繞他們是否喜歡切換=) – Ryan

回答

7

用它來你的優勢:

foo !== foo 

這相當於typeof foo === 'number' && isNaN(foo),和is what Underscore.js uses to check for exactly NaN, too

+0

哦,對了,我多次讀取的是'NaN'是,不等於自己唯一的價值。 – djechlin

+0

雙方,富將具有相同的價值。那麼比較有什麼意義呢? –

+0

@PKKG:'NaN!== NaN' =) – Ryan

3

原因楠不等於本身就是兩個計算可以成爲NaN的原因不同。如果你做兩次計算並比較結果,如果其中一個值是NaN,或者兩者都不相等,那麼你不希望它們相等。

isNaN方法效果很好,只要你只使用它的數值。它給很多其他類型提供了不直觀的結果,所以你不應該在數字以外的任何地方使用它。

+0

雖然這回答了這個問題嗎? (代碼特別說明了「如果這是一個數值」,例如) – Ryan

+0

@minitech:是的,問題的這一部分是在我回答後添加的,並且這個答案證實了'isNaN'的結果只對數值有意義值。 – Guffa

0

如果你可以使用ECMAScript 6,你有Object.is

return Object.is(foo, NaN); 

Object.is()確定兩個值是否相同的值。兩個值是相同的,如果下列之一成立:
[...]

  • NaN

MDN還提出了一種Polyfill如果Object.is沒有定義(使用相同的foo!==foo絕招):

if (!Object.is) { 
    Object.is = function(x, y) { 
    // SameValue algorithm 
    if (x === y) { // Steps 1-5, 7-10 
     // Steps 6.b-6.e: +0 != -0 
     return x !== 0 || 1/x === 1/y; 
    } else { 
     // Step 6.a: NaN == NaN 
     return x !== x && y !== y; 
    } 
    }; 
} 
相關問題