是什么导致NaN出现故障?

时间:2013-06-13 19:17:32

标签: javascript nan numerical-computing

我只是想评估输入是否是数字,并且认为isNaN是最好的方法。但是,这会导致不可靠的结果。例如,使用以下方法:

function isNumerical(value) {
    var isNum = !isNaN(value);
    return isNum ? "<mark>numerical</mark>" : "not numerical";
}

关于这些值:

isNumerical(123));     // => numerical
isNumerical("123"));   // => numerical
isNumerical(null));    // => numerical
isNumerical(false));   // => numerical
isNumerical(true));    // => numerical
isNumerical());        // => not numerical

显示在这个小提琴中:http://jsfiddle.net/4nm7r/1

为什么isNaN始终不适合我?

4 个答案:

答案 0 :(得分:5)

如果传递的值不是数字(NaN),则

isNaN会返回true(或者如果无法将其转换为数字,那么nulltruefalse将转换为0),否则返回false。在您的情况下,您必须在函数调用之前删除!

很容易理解脚本的行为。 isNaN只是检查一个值是否可以转换为int。要做到这一点,你只需将它乘以或除以1,或减去或加0.在你的情况下,如果你这样做,在你的函数alert(value * 1);内,你会发现所有那些传递的值将被替换为一个数字(0,1,123),undefined除外,其数值为NaN

你无法将任何值与NaN进行比较,因为它永远不会返回false(甚至是NaN === NaN),我认为这是因为NaN是动态生成的...但我不确定。< / p>

无论如何,只需执行此操作即可修复代码:

function isNumerical(value) {
    var isNum = !isNaN(value / 1); //this will force the conversion to NaN or a number
    return isNum ? "<mark>numerical</mark>" : "not numerical";
}

答案 1 :(得分:1)

如果!isNaN()返回true,您的三元语句是向后的,您想说"numerical"

return isNum ? "not numerical" : "<mark>numerical</mark>";

应该是:

return isNum ? "<mark>numerical</mark>" : "not numerical";

请参阅更新的小提琴:

http://jsfiddle.net/4nm7r/1/

答案 2 :(得分:1)

现在您已经修复了其他答案中指出的反向逻辑,使用parseFloat来消除truefalsenull的误报:< / p>

var isNum = !isNaN(parseFloat(value));

请记住parseFloat的以下类型的输出:

parseFloat("200$"); // 200
parseFloat("200,100"); // 200
parseFloat("200 foo"); // 200
parseFloat("$200"); // NaN

(即,如果字符串以数字开头,parseFloat将提取它可以找到的第一个数字部分)

答案 3 :(得分:1)

我建议你使用额外的支票:

function isNumerical(value) {
    var isNum = !isNaN(value) && value !== null && value !== undefined;
    return isNum ? "<mark>numerical</mark>" : "not numerical";
}

如果您希望将123这样的字符串视为不是数字,那么您应该再添加一个支票:

var isNum = !isNaN(value) && value !== null && value !== undefined && (typeof value === 'number');