为什么isNaN(“1”)是假的?

时间:2014-01-17 02:59:32

标签: javascript

我正在尝试为函数输入编写一个简单的测试,以确定所有输入是否都是数字。

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

但是,当我将数字列表作为字符传递(例如数字(“1”,“2”))时,我得到true而不是预期的false

3 个答案:

答案 0 :(得分: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);
    });
}

答案 1 :(得分:0)

你误解了NaN的含义。这不是数字测试。它是Number的特定值,表示它不是数字。您可以使用正则表达式来测试数值。

答案 2 :(得分:0)

isNan()会尝试将其转换为数字,然后检查。我会改用

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

或者,如果您使用的是jQuery,则可以使用其内置的$.isNumeric()函数