我正在尝试为函数输入编写一个简单的测试,以确定所有输入是否都是数字。
function numbers(){
for (var i = 0; i < arguments.length; i++) {
if (isNaN(arguments[i])) return false;
}
return true;
}
但是,当我将数字列表作为字符传递(例如数字(“1”,“2”))时,我得到true
而不是预期的false
。
答案 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()
函数