6

我只是想评估输入是否是数字,并且认为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

4 回答 4

5

isNaNtrue如果传递的值不是数字(NaN) ,则返回(或者如果它不能转换为数字,因此,,null并将true转换false0),否则返回false!在您的情况下,您必须在函数调用之前删除!

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

你不能比较任何值,NaN因为它永远不会返回 false(even NaN === NaN),我认为那是因为 NaN 是动态生成的......但我不确定。

无论如何,您可以通过简单地执行以下操作来修复您的代码:

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";
}
于 2013-06-13T19:19:04.837 回答
1

你的三元语句是倒退的,如果!isNaN()返回 true 你想说"numerical"

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

应该:

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

查看更新的小提琴:

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

于 2013-06-13T19:23:25.463 回答
1

既然您已经修复了其他答案中指出的反向逻辑,请使用来消除和的parseFloat误报truefalsenull

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

请记住以下类型的输出parseFloat

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

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

于 2013-06-13T20:02:02.950 回答
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');
于 2013-06-13T20:37:23.517 回答