如何在Typescript中检查值是否为NaN?

86

在 TypeScript 中,如何检查某个值是否为 NaN

以下方法不起作用:

someObject.someValue == NaN
someObject.someValue === NaN

1
我支持这个问题,因为它不同于在Javascript中询问isNaN,因为Typescript现在禁止测试除数字以外的任何内容 - 根据下面的最后一条评论。 - GG2
1个回答

157

与 JavaScript 相同,isNaN

if (isNaN(someObject.someValue)) ...

或者更现代的 Number.isNaN

if (Number.isNaN(someObject.someValue)) ...

两者之间的区别在于:

  • isNaN() 会将任何非数字值(typeof value !== 'number')强制转换为数字,然后执行比较;它检查任何尝试转换为数字时变成 NaN 的内容
  • Number.isNaN() 在接收到非数字时始终返回 false;它实际上是检查已经是 NaN 的内容

换句话说,对于这些值,您会得到以下结果:

isNaN() Number.isNaN() typeof value === 'number'
123 false false true
NaN true true true
true/false false false false
'a string' true false false
new Date() false false false
[] false false false
{} true false false

5
任何不是 NaN 的东西都会返回 false。字符串、nullundefined、布尔值——它们都会从 Number.isNaN() 或简单的 isNaN() 中返回 false。该函数不是测试某些东西是否“不是一个数字”,而是测试它是否是 NaN,这是一种特定的无效数字值,在实际中的含义是如此。如果要测试某些东西是否不是数字,请执行 typeof something !== "number" || isNaN(something) - zeh
4
如果其他人看到此信息,window.isNaN()会将一个值强制转换为数字,然后检查它是否为NaN。因此,undefined"hello"将返回true,而undefined""将返回false。这就是为什么添加Number.isNaN的原因,因为它可以明确地检查NaN,而不进行初始强制转换。 - Brook Jordan
2
根据Typescript(es5+)的规定,isNaN()函数只接受一个number类型的参数作为其第一个参数。 - S.D.
1
嗯,这个表格不是100%正确的。在浏览器中测试时,isNaN([])返回false,这是有道理的,因为[]被强制转换为0。或者这是最近的变化吗? - Clarity
1
@Clarity 你说得对。我刚刚检查了表格和参考资料中的描述,它首先是强制转换的。"非数字总是返回true"的想法是不正确的。我不确定这是否是最近的更改;这似乎不太可能。我认为更有可能的是原始编辑(由另一位作者完成)事实上是错误的。我重新进行了所有检查,并更新了表格和描述以使其正确(日期和布尔值也是不正确的)。 - zeh
显示剩余2条评论

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