为什么Number.isNaN()对于字符串返回false?

5
根据我的理解,NaN代表着“不是一个数字”。字符串并不一定是数字,因此我期望以下代码对于字符串的返回值应该是true。但事实并非如此。

console.log(Number.isNaN("Stack Overflow"));

请问有人可以澄清这个问题吗?


NaN 实际上是一个值。 - E net4
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN - Teemu
5
Number.isNaN 只有在其参数为 NaN 时才会返回 true。这似乎很奇怪,但它存在的原因是因为 NaN === NaN 表达式的 falsiness。 - raina77ow
console.log(isNaN("Stack Overflow"));控制台.日志(是NaN("Stack Overflow")); - Shiladitya
1
可能是为什么typeof NaN返回'number'?的重复问题。 - E net4
9个回答

10
Number.isNaNisNaN 之间有区别。
参考链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/isNaNhttps://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaNisNaN() 方法用于确定一个值是否为 NaN。
Number.isNaN() 方法可用于判断传递的参数是否是 NaN,且类型为 Number。它是原始全局方法 isNaN() 的更强大的版本。
代码返回 false 的原因是 "Stack Overflow" 不是数字,而是字符串。

console.log('Number.isNaN("Stack Overflow"): '+Number.isNaN("Stack Overflow"));
console.log('isNaN("Stack Overflow"): '+isNaN("Stack Overflow"));


6
我越想就越觉得这很令人困惑! - Willa

1

1

这将返回true:

console.log(isNaN("Stack Overflow"));

而这将返回false:

console.log(Number.isNaN("Stack Overflow"));


0

这不是 Number.isNaN。

console.log(isNaN("Stack Overflow"));


但是确实存在 Number.isNaN - Mohit Bhardwaj
@MohitBhardwaj 是的,但它执行的是不同的操作。 - Andrew Bone
3
@AndrewBone,是的,但答案应该解释它们之间的区别。或者说明尽管有Number.isNaN(),但在这种情况下应使用isNaN() - Mohit Bhardwaj
@MohitBhardwaj 如果你想了解更多关于Number.isNaN的内容,请查看文档 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN - Shiladitya
@Shiladitya 这是我在第一条评论中发布的相同链接吗?我的意思是,如果您添加了两者之间的区别,您的答案可能会更有用。目前,当它说“它不是Number.isNan”时,它只是明显错误的。 - Mohit Bhardwaj

0

我在这里添加一些内容,这让我感觉有点清晰。

对于我的目的来说,“不是数字”和NaN之间存在区别。

  • “不是数字”可以是任何其他不是数字的原始类型。

  • NaN是数值Number.NaN。

console.log(isNaN("StackOverflow")); => true,因为它仅检查值是否为“不是数字”

console.log(isNaN("3")); => false,因为isNaN在检查输入是否为“不是数字”之前进行转换

如果a = NaN且b = Number.NaN。

所有a都是b,但并非所有b都是a。

我们只会在特定情况下获得Number.IsNaN() = true(因为所有a都是b,对于这些情况,我们也将具有IsNan() = true):

1. 在转换失败时:parseInt("a"); 2. 在执行不返回实数的数学操作时:Math.sqrt(-1); 3. 不定形式(0 * Infinity) 4. 当我们使用NaN作为操作数时:7 * NaN(NaN是具有感染性的!) 5. 当我们想要将无效值表示为数字时:new Date("a").getTime();

0
这似乎很奇怪,但一旦理解了NaN在严格意义上的含义是“不是数字”(例如除以零等),就可以使用以下代码:

这里有一个链接为什么typeof NaN返回“number”?

typeof value === "number" && !isNaN(value)

感谢 @dgolive。当时我还是个新手。 - Beginner

0

我必须这样做

Number.isNaN(Number("Stack Overflow")) // returns true
Number.isNaN(Number(false)) // returns false (unfortunately)
Number.isNaN(Number(12)) // returns false
Number.isNaN(Number(12.02)) // returns false

-1
尝试这个:

console.log(isNaN("Stack Overflow"));


-2
根据MDN,非数字值首先被强制转换为数字,然后测试是否为NaN。因此,在JS中,空字符串("")被认为是假的,并且被转换为0,这绝对是一个数字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接