导致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