导致NaN故障的原因是什么?
这个问题在这里已经有了答案:
如果传递的值不是数字(NaN) (或者它不能被转换为数字,那么null
, true
和false
将被转换为0
), isNaN
将返回true
,否则返回false
。 在你的情况下,你必须删除!
在函数调用之前!
理解脚本的行为是非常容易的。 isNaN
只是检查一个值是否可以转换为int。 要做到这一点,你只需要乘以或除以1,或者减去或加0.在你的情况下,如果你这样做,在你的函数中, alert(value * 1);
你会看到所有通过的值将被一个数字(0,1,123)取代,除了undefined
,其数值是NaN
。
你不能比较任何值到NaN
因为它永远不会返回false(甚至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";
}
你的三元语句是落后的,如果!isNaN()
返回true,你想说"numerical"
return isNum ? "not numerical" : "<mark>numerical</mark>";
应该:
return isNum ? "<mark>numerical</mark>" : "not numerical";
查看更新的小提琴:
http://jsfiddle.net/4nm7r/1/
现在您已经修复了在其他答案中指出的反转逻辑,请使用parseFloat
来排除true
, false
和null
false
:
var isNum = !isNaN(parseFloat(value));
请记住parseFloat
的以下几种输出:
parseFloat("200$"); // 200
parseFloat("200,100"); // 200
parseFloat("200 foo"); // 200
parseFloat("$200"); // NaN
(即,如果字符串以数字开头,则parseFloat将提取它可以找到的第一个数字部分)
链接地址: http://www.djcxy.com/p/26403.html