javascript - 你如何在 JavaScript 中测试 NaN?

标签 javascript nan

我有一个变量 x,我想测试 x 是否设置为 NaN。我该怎么做?

我的第一直觉可能是,你知道,像这样测试它:

if (x === NaN) {  ...

傻兔子,不,那太容易了。 NaN 就像 SQL 中的 NULL,它不等于任何东西,甚至不等于它自己。

但是看,有一个名为 isNaN() 的函数——也许它可以做到这一点!

不,据我所知,isNaN() 完全没有值(value)。

例如,isNaN([""]) 正确返回 false,但 isNaN(["."]) 返回 true。你不会想知道我是如何了解到这个缺陷的。

我该怎么做?

事实证明,我的问题是 this one 的重复问题,但选择的答案是错误的。 right answer有 20% 的赞成票。

最佳答案

简答题

对于 ECMAScript-5 用户:

#1
if(x !== x) {
    console.info('x is NaN.');
}
else {
    console.info('x is NOT a NaN.');
}

对于使用 ECMAScript-6 的人:

#2
Number.isNaN(x);

并且为了跨 ECMAScript 5 和 6 的一致性,您还可以使用这个 polyfill for Number.isNan

#3
//Polyfill from MDN
Number.isNaN = Number.isNaN || function(value) {
    return typeof value === "number" && isNaN(value);
}
// Or
Number.isNaN = Number.isNaN || function(value) {     
    return value !== value;
}

注意:我更喜欢使用 #1 进行测试,它在所有地方都可以正常工作,并且也不依赖于最新的 JS。 (它总是给我正确的结果。没有惊喜!)


详细说明:

这是我们很棒的 NaN

NaN == NaN; // false
NaN === NaN; // false

请不要为此责怪 JavaScript,NaN 在其他语言中也应该以这种方式表现,根据 rationale for all comparisons returning false NaN values 没问题。

因此 isNaN 成为我们的救世主,但在某些情况下它的行为略有不同,例如

isNaN(undefined); // true
isNaN({});        // true
isNaN("lorem ipsum"); // true

看到上面的结果,我有一些奇怪的面孔。这是来自 MDN 的原因

When the argument to the isNaN function is not of type Number, the value is first coerced to a Number. The resulting value is then tested to determine whether it is NaN.

那么我们应该如何测试非数字变量的 NaN 呢?我总是遵循以下内容

if(x !== x) {
    console.info('Is a NaN');
}
else {
    console.info('Not a NaN');
}

ECMAScript-6/JavaScript-2015 更新

我们在 ECMAScript-6 中有什么相同的东西吗?是的,我们做...

Number.isNaN(x); // true

ES6 实现也将有助于上述情况

Number.isNaN(undefined); // false
Number.isNaN({}); // false    
Number.isNaN("lorem ipsum"); // false

而 ECMAScript-5 全局函数 isNaN 在上述情况下输出 true,这有时可能与我们的预期不符。

关于javascript - 你如何在 JavaScript 中测试 NaN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30314447/

相关文章:

javascript - 无法将类添加到 $(this) 的下一个元素

javascript - 设置动态变化的元素的左侧位置(循环中)

javascript - XMLHttpRequest progress事件比实际上传快很多

javascript - 提交时确认表格

arrays - 将 numpy 数组中的 NaN 转换为大数(即 99999)

javascript - 在类上应用 Jquery Accordion

javascript - 运行函数更改变量时返回 NaN

python - Sci-Kit 学习 SGD 算法时出错 - "Array contains NaN or infinity"

python - 如何从字典中删除南键?

javascript - 为什么是 `null + 1 = 1` 而不是 `undefined + 1 = NaN` ?