isNaN 和 Number.isNaN 函数有什么区别?
isNaN
和 Number.isNaN
都是 JavaScript 中用于检查值是否为 "NaN"(Not-a-Number)的函数,但它们在判断的逻辑上有所不同。
1.
isNaN
isNaN
是全局函数,用于判断一个值是否是 NaN 或是否不能转换为一个有效的数字。如果传入的值无法被转换成数字,isNaN
会返回 true
,否则返回 false
。
特点:
isNaN
会先尝试将传入的值转换为数字。- 如果值本身不是数字(例如字符串、对象等),它会尝试强制转换为数字,然后判断转换后的结果是否是
NaN
。
示例:
isNaN('hello'); // true,因为字符串 'hello' 不能被转换为数字
isNaN(123); // false,已经是一个有效数字
isNaN('123'); // false,因为字符串 '123' 会被转换为数字 123
isNaN(true); // false,因为布尔值 true 会被转换为数字 1
isNaN(undefined); // true,因为 undefined 不能转换为有效的数字
2.
Number.isNaN
Number.isNaN
是 Number
对象的方法,用于严格检查传入的值是否 是 NaN,而不做类型转换。如果传入的值本身就是 NaN
,才返回 true
,否则返回 false
。
特点:
Number.isNaN
不会进行类型转换,只会判断值是否严格等于NaN
。- 如果值不是
NaN
,无论它是什么类型,它都返回false
。
示例:
Number.isNaN('hello'); // false,因为 'hello' 不是 NaN
Number.isNaN(123); // false,123 不是 NaN
Number.isNaN(NaN); // true,因为它是 NaN
Number.isNaN(undefined); // false,undefined 不是 NaN
主要区别:
-
类型转换:
isNaN
会首先将参数强制转换为数字,然后判断结果是否为NaN
;而Number.isNaN
不会进行任何类型转换,它只会返回true
如果传入的值本身就是NaN
。 -
准确性:由于
isNaN
会进行类型转换,它可能会导致一些意外的结果(例如,isNaN('123')
返回false
,虽然'123'
不是NaN
,但它会被转换为数字)。而Number.isNaN
更精确,它只返回true
当且仅当传入的值是NaN
。
总结:
isNaN
:先转换为数字,如果转换结果是NaN
,返回true
。Number.isNaN
:严格检查值是否是NaN
,没有类型转换。
通常情况下,Number.isNaN
更为准确,因此在判断是否是 NaN
时,推荐使用 Number.isNaN
。