我正在学习一些 JavaScript 并遇到了一个怪癖,想知道是否有人知道覆盖这种行为的方法。我希望能够测试传递给函数的值是否为实数,我认为使用 ===
进行 isNaN()
检查会解决这个问题,但事实并非如此。
示例函数:
var foodDemand = function(food) {
if (isNaN(food) === false) {
console.log("I can't eat " + food + " because it's a number");
} else {
console.log("I want to eat " + food);
}
};
我用这个测试:
// behaves as expected
foodDemand("steak");
foodDemand(999999999);
foodDemand(0.0000001337);
foodDemand([1]);
foodDemand(undefined);
foodDemand(NaN);
foodDemand({});
// converts non-number to a number
foodDemand("42");
foodDemand("");
foodDemand(null);
foodDemand([]);
foodDemand("\n");
输出(斜体代表意外结果):
有没有办法让
isNaN()
更严格? 最佳答案
isNaN
的目的并不是真正测试某事物是否真的不是数字,而是测试某事物是否是数字 NaN(因为 NaN===NaN
在 JavaScript 中返回 false,您不能使用相等性)。
您应该使用 typeof
代替,然后使用 isNaN:
if((typeof food)==="number" && !isNaN(food))
你可能会问,为什么
NaN
不等于 NaN
??这是 JavaScript 臭名昭著的怪癖之一吗?事实证明,这种行为是有充分理由的。不能返回真实结果的数学运算,即使是无穷大,也不会提示并抛出错误。他们只返回 NaN。例如,0/0、sqrt(-1)、acos(2)。有
Math.sqrt(-1) === 0/0
会不会很奇怪?所以 NaN 甚至不等于它自己。因此,如果您真的想检查值是否为 NaN,则需要像 isNaN
这样的原语。关于javascript - 防止 isNaN 隐式转换为数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29658839/