我正在学习一些 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/

10-12 06:21