2014-01-17 71 views
3

我想寫一個函數輸入的簡單測試,以確定是否所有的輸入都是數字。爲什麼isNaN(「1」)是false?

function numbers(){ 
    for (var i = 0; i < arguments.length; i++) { 
    if (isNaN(arguments[i])) return false; 
    } 
    return true; 
} 

然而,當我通過在數轉換爲字符的列表(例如,數字(「1」,「2」))我得到true而不是預期的false

+0

你傳遞字符串作爲反對數字? – Houseman

+3

isNaN不檢查類型,簡單地說,它只是看它是否是一個數字(更具體地說,如果它不是數字),即使它是一個字符串內的數字。 – adeneo

+0

'isNaN'並不意味着用於確定參數是否是數字。它是用來確定參數是否是浮點型NaN值。 – user2357112

回答

4

isNaN隱含地將參數強制轉換爲Number,然後檢查此強制值是否爲NaN。
參見http://es5.github.io/#x15.1.2.4

即,isNaN(foo)相當於isNaN(Number(foo))

代碼修正:

if (typeof arguments[i] !== 'number' || isNaN(arguments[i])) return false; 

的條件的第二部分是因爲typeof NaN === 'number'


你的功能可能是功能性風格有點更具可讀性,使用ES5的Array#every方法:

//returns whether all arguments are of type Number and not NaN 
function numbers() { 
    return [].every.call(arguments, function(arg) { 
     return typeof arg === 'number' && !isNaN(arg); 
    }); 
} 
+0

並且因爲每個[嚴格平等比較算法](http://ecma-international.org/ecma-262/5.1/#sec-11.9.6)的'NaN!== NaN'。然而,爲了將'NaN'作爲'x!== x' **進行測試並不是必需的**如果'x'是'NaN'(儘管它很方便且更具表現力),則返回「true」。 – RobG

+0

@RobG是的,感謝提到'NaN!== NaN',我猜是我下意識地跳過了它,因爲任何已經嘗試將NaN結果與=== NaN進行比較的人都會知道''=]'。 'x!== x'技巧記錄在我發佈的帶註釋的ES鏈接中(雖然我更喜歡'isNaN'功能來表達)。感謝您的意見。 –

0

你誤會楠意義。這不是一個數字測試。它是一個數字的具體值,表明它不是一個數字。您可以使用正則表達式來測試數值。

0

isNan()將嘗試將其轉換爲數字,然後檢查。 ,我會用這個代替

if(!isNaN(parseFloat(arguments[i])) && isFinite(arguments[i])){ 
    return false; 
} 

另外,如果你使用jQuery,你可以使用其內置的$.isNumeric()功能

相關問題