在 JavaScript 中,全局函数 isNaN 与 Number.isNaN 方法在处理非数值参数时的行为有何不同?请说明各自的判断逻辑及适用场景。
考察说明
考查对 JavaScript 中两种 NaN 检测方法底层机制与使用差异的掌握程度。
回答思路
- 【回答框架 1】isNaN 是全局函数,执行时会先尝试将参数强制转换为数字,再判断转换结果是否为 NaN。因此,对于非数值类型如字符串、对象等,只要转换失败或结果为 NaN,isNaN 就会返回 true,例如 isNaN('abc') 为 true,isNaN(undefined) 为 true。
- 【回答框架 2】Number.isNaN 是 ES6 新增的静态方法,它不会进行类型转换,只有当参数本身是 number 类型且值恰好为 NaN 时才返回 true。因此 Number.isNaN('abc') 为 false,Number.isNaN(NaN) 为 true,Number.isNaN(undefined) 为 false。
- 【回答框架 3】区分二者时,关键在于是否发生隐式类型转换。需要检测一个值是否为真正的 NaN(而非可转换为 NaN 的值)时,应使用 Number.isNaN;若意图判断某个值经过转换后是否非数值,则使用全局 isNaN。
- 【关键点 1】isNaN 先转数字再判断,非数字类型可能返回 true;Number.isNaN 不转换,仅对 number 类型的 NaN 返回 true。
- 【关键点 2】Number.isNaN 是更严格、更可靠的 NaN 检测方法。
- 【关键点 3】实际开发中建议优先使用 Number.isNaN。
- 【易错点 1】不要用 isNaN 检测一个值本身是否为 NaN,因为字符串等非数值类型也会得到 true。
- 【易错点 2】注意 Number.isNaN 不会对参数进行隐式转换,这与全局 isNaN 的行为有本质区别。