isNaN 和 Number.isNaN 函数的区别
isNaN
isNaN() 是 JavaScript 的全局函数,用于判断一个值是否为 NaN(Not a Number)。
工作原理
isNaN()会首先尝试将参数转换为数字- 如果转换失败,则返回
true - In 如果转换成功,则判断转换后的值是否为 NaN
示例
// 数字类型
isNaN(123); // false,123是数字
isNaN(0); // false,0是数字
isNaN(NaN); // true,NaN不是数字
// 字符串类型
isNaN("123"); // false,可以被转换为数字
isNaN("hello"); // true,不能被转换为数字
isNaN(""); // false,空字符串被转换为0
// 其他类型
isNaN(true); // false,转换为1
isNaN(null); // false,转换为0
isNaN(undefined); // true,转换失败
isNaN({}); // true,转换失败
isNaN([1, 2]); // true,转换失败
isNaN([1]); // false,转换为1
Number.isNaN
Number.isNaN() 是 ES6 引入的新方法,用于更严格地判断一个值是否为 NaN。
工作原理
Number.isNaN()不会尝试将参数转换为数字- 只有当参数是数字类型且值为 NaN 时,才返回
true
示例
// 数字类型
Number.isNaN(123); // false,123是数字但不是NaN
Number.isNaN(0); // false,0是数字但不是NaN
Number.isNaN(NaN); // true,参数是NaN
// 字符串类型
Number.isNaN("123"); // false,字符串不是NaN
Number.isNaN("hello"); // false,字符串不是NaN
Number.isNaN(""); // false,字符串不是NaN
// 其他类型
Number.isNaN(true); // false,布尔值不是NaN
Number.isNaN(null); // false,null不是NaN
Number.isNaN(undefined); // false,undefined不是NaN
Number.isNaN({}); // false,对象不是NaN
Number.isNaN([1, 2]); // false,数组不是NaN
关键区别
-
类型转换:
isNaN()会尝试将参数转换为数字,然后判断结果是否为 NaNNumber.isNaN()不进行类型转换,只判断参数是否是数字类型且值为 NaN
-
使用场景:
- 如果需要严格判断一个值是否为 NaN,应该使用
Number.isNaN() - 如果需要判断一个值转换为数字后是否为 NaN,可以使用
isNaN()
- 如果需要严格判断一个值是否为 NaN,应该使用
-
兼容性:
isNaN()在所有 JavaScript 环境中都可用Number.isNaN()是 ES6 引入的方法,在旧环境中可能需要 polyfill
自己实现 Number.isNaN
// 如果需要在不支持的环境中使用Number.isNaN
if (!Number.isNaN) {
Number.isNaN = function (value) {
return typeof value === "number" && isNaN(value);
};
}
这种实现确保了只有在参数为数字类型且值为 NaN 时才返回 true。