2014-01-17 3 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 неявно принуждает аргумент к номеру, а затем проверяет, является ли это принудительное значение 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'.


Вашей функция может быть немного более удобной для чтения в функциональном стиле, с использованием метода Array#every ES5 в:

//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

И потому что 'NaN! == NaN' за [алгоритм сравнения строгого равенства] (http://ecma-international.org/ecma-262/5.1/#sec-11.9.6). Однако это не требуется для проверки «NaN» как 'x! == x' ** только ** возвращает' true', если 'x' является' NaN' (хотя он удобен и более выразителен). – RobG

+0

@RobG Да, спасибо за упоминание, что «NaN! == NaN», думаю, я подсознательно пропустил его, так как любой, кто уже пытался сравнить результат NaN с === NaN, знал бы этот бит '=]'. Трюк 'x! == x' задокументирован в аннотированной ссылке ES, которую я опубликовал также (хотя я предпочитаю функцию' isNaN' для выразительности). Спасибо за ввод. –

0

Вы недопонимание значения NaN. Это не числовой тест. Это определенное значение числа, которое указывает, что оно не является числом. Вы можете использовать регулярное выражение для проверки числовых значений.

0

isNan() попытается отправить его на номер, а затем проверить. Я хотел бы использовать это вместо

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

В качестве альтернативы, если вы используете JQuery, вы можете использовать встроенный в $.isNumeric() функции

Смежные вопросы