在 TypeScript 中,如何检查某个值是否为 NaN
?
以下方法不起作用:
someObject.someValue == NaN
someObject.someValue === NaN
在 TypeScript 中,如何检查某个值是否为 NaN
?
以下方法不起作用:
someObject.someValue == NaN
someObject.someValue === NaN
与 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 |
NaN
的东西都会返回 false
。字符串、null
、undefined
、布尔值——它们都会从 Number.isNaN()
或简单的 isNaN()
中返回 false
。该函数不是测试某些东西是否“不是一个数字”,而是测试它是否是 NaN,这是一种特定的无效数字值,在实际中的含义是如此。如果要测试某些东西是否不是数字,请执行 typeof something !== "number" || isNaN(something)
。 - zehwindow.isNaN()
会将一个值强制转换为数字,然后检查它是否为NaN
。因此,undefined
和"hello"
将返回true
,而undefined
和""
将返回false
。这就是为什么添加Number.isNaN
的原因,因为它可以明确地检查NaN
,而不进行初始强制转换。 - Brook JordanisNaN()
函数只接受一个number
类型的参数作为其第一个参数。 - S.D.isNaN([])
返回false
,这是有道理的,因为[]
被强制转换为0
。或者这是最近的变化吗? - Claritytrue
"的想法是不正确的。我不确定这是否是最近的更改;这似乎不太可能。我认为更有可能的是原始编辑(由另一位作者完成)事实上是错误的。我重新进行了所有检查,并更新了表格和描述以使其正确(日期和布尔值也是不正确的)。 - zeh