2013-03-02 100 views
7

從underscore.js源摘自:理解下劃線的實施isNaN

_.isNaN = function(obj) { 
    return _.isNumber(obj) && obj != +obj; 
}; 

他們爲什麼做這種方式?以上實現是否相當於:

_.isNaN = function(obj) { 
    return obj !== obj; 
}; 

如果是,爲什麼「更復雜」版本?如果不是,行爲差異是什麼?

+0

或者更簡單,本機'isNaN'功能... – 2013-03-02 15:24:55

+2

@Kolink從下劃線文檔拍攝:「注意:如果變量是不確定的,這是不一樣的本地isNaN功能,這也將返回true」 – robertklep 2013-03-02 15:26:23

+1

@Kolink' isNaN(未定義)'給出true。 – 2013-03-02 15:27:14

回答

4

_.isNaN(new Number(NaN))返回true。

這就是by design

var n = new Number(NaN); 
console.log(_.isNaN(n), n!==n); // logs true, false 
+1

所以現在'Number.isNaN()'。 – Pointy 2013-03-02 15:34:30

+0

@Pointy'Number.isNaN(新數(NAN))''返回作爲FALSE'的Chrome 26.0.1410.65和FireFox 21 – Andbdrew 2013-05-18 20:28:15

+0

@Andbdrew是的,這就是我的意思 - 'Number.isNaN()'返回true,只有當它的參數是原始類型'數字'(不是'數字'),並且是特殊的'NaN'常數。 – Pointy 2013-05-18 20:33:45

1

主機環境(例如網頁瀏覽器環境)可能會引入其他不等於自己的值。該_.isNumber(obj)部分可以確保輸入的是數值,因此,如果NaN值傳遞_.isNaN只返回true

+1

你有一個主機環境的例子,介紹一個不等於自己的值? – Randomblue 2013-03-02 16:17:31

+0

@Randomblue沒有。我從來沒有聽說過這樣的價值,因此*可能*。 – 2013-03-02 18:50:27

+0

好的。聰明的想法,理論上說,主機環境把所有的賭注都關閉了。 – Randomblue 2013-03-02 18:57:05

0

如果+與前款沒有價值+任意值的前給予JavaScript引擎將嘗試把變量轉換爲Number.If它是有效的,它會給你數否則將返回NaN的。例如

+ "1" // is equal to integer value 1 
+ "a1" // will be NaN because "a1" is not a valid number 

在上述情況下

+"a1" != "a1" // true, so this is not a number, one case is satisfied 
+"1" == "1" // true, so it is number 

另一種簡單的情況下將是,爲什麼以下表達式得到該輸出

console.log("Why I am " + typeof + ""); 
// returns "Why I am number" 

因爲+ 「」 爲0

如果你想檢查它是否是一個數字,你可以使用下面的函數

function isNumber(a){ 
    /* first method : */ return (+a == a); 
    /* second method : */ return (+(+a) >= 0); 
    // And so many other exists 
} 

有人糾正我,如果我錯了地方..

+0

JavaScript中沒有整數。 '+「1.5e-1」' – Bergi 2013-03-02 16:14:19

+0

@Bergi上述功能是否以+「1.5e-1」失敗?是的,整數,而不是數字是錯字..我同意..你在javaScript中稱爲0.1?..? – Exception 2013-03-02 16:37:09

+0

不,但'0.15'是一個非整數,純數*的例子:-) – Bergi 2013-03-02 16:38:11

0

我發現一個案例_.isNaN 它顯示了與本地一個不同的結果,如果你有傳遞一個對象

_.isNaN({}) => false 
//but 
isNaN({}) => true