isNaN 和 Number.isNaN 函数的区别

179 阅读2分钟

isNaN 和 Number.isNaN 函数的区别

isNaN

isNaN() 是 JavaScript 的全局函数,用于判断一个值是否为 NaN(Not a Number)。

工作原理

  1. isNaN() 会首先尝试将参数转换为数字
  2. 如果转换失败,则返回 true
  3. 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。

工作原理

  1. Number.isNaN() 不会尝试将参数转换为数字
  2. 只有当参数是数字类型且值为 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

关键区别

  1. 类型转换

    • isNaN() 会尝试将参数转换为数字,然后判断结果是否为 NaN
    • Number.isNaN() 不进行类型转换,只判断参数是否是数字类型且值为 NaN
  2. 使用场景

    • 如果需要严格判断一个值是否为 NaN,应该使用 Number.isNaN()
    • 如果需要判断一个值转换为数字后是否为 NaN,可以使用 isNaN()
  3. 兼容性

    • 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。