选择题1499/1620输出什么?

1const name = "Lydia Hallie"; 2const age = 21; 3 4console.log(Number.isNaN(name)); 5console.log(Number.isNaN(age)); 6 7console.log(isNaN(name)); 8console.log(isNaN(age));
难度:
2021-07-02 创建

本题为"单选题"

参考答案:

正确选项:C:false false true false

1. isNaN()

isNaN函数是用来确定一个值是否是NaN,可以在全局直接使用,返回值是一个布尔值truefalse

1// 基础用法 2isNaN(1) // false 3isNaN(NaN) // true

但是isNaN方法有一些怪异的行为,不然也不会有Number.isNaN函数什么事了:

1isNaN(undefined); // true 2isNaN({}); // true 3isNaN("37,5") // true 4isNaN("123ABC") // true 5isNaN("abc") // true

可以看到,以上的这些isNaN函数的参数都不是NaN,怎么还返回true呢? MDN的解释是这样的:如果isNaN函数的参数不是Number类型, isNaN函数会首先尝试将这个参数转换为数值,然后才会对转换后的结果是否是NaN进行判断, 也就是说,isNaN的参数首先会执行Number()进行强制转换,然后再去判断是否是NaN:

1isNaN(true) // false 因为Number(true)值为1,而1不是NaN, 所以返回false 2isNaN(undefined); // true 因为Number(undefined)值为NaN, 所以返回true 3isNaN({}); // true 因为Number({})值为NaN, 所以返回true 4isNaN('abc'); // true 因为Number(abc)值为NaN, 所以返回true 5isNaN(''); // false 因为Number('')值为0, 所以返回false 6复制代码

2. Number.isNaN()

Number.isNaN() 方法确定传递的值是否为 NaN,并且检查其类型是否为 Number,它的返回值是布尔类型。它是原来的全局 isNaN()的更稳妥的版本(注意:ECMAScript 2015版本才有Number.isNaN())。

也就是说,Number.isNaN函数会先检查参数是不是Number类型,如果不是,直接会返回false,只有参数是Number类型才会去判断是不是NaN,我们用Number.isNaN再验证下之前的例子:

1// 基本使用 2Number.isNaN(NaN) // true 3Number.isNaN(1) // false 4 5// 特殊情况 6Number.isNaN(true) // false 因为true不是Number类型 7Number.isNaN(undefined) // false 因为undefined不是Number类型 8Number.isNaN({}) // false 因为{}不是Number类型 9Number.isNaN("abc") // false 因为"abc"不是Number类型 10Number.isNaN("") // false 因为""不是Number类型

3. 推荐使用Number.isNaN()

通过上述的几个例子可以看到,Number.isNaN用来判断某个值是否是NaN更像是我们理想型用法,不会产生一些比较怪异的行为,使我们的代码更加的严谨,防止出现bug, 所以在写代码的时候更推荐使用Number.isNaN这个方法来确定一个值是否是NaN

最近更新时间:2023-02-02

赞赏支持

题库维护不易,您的支持就是我们最大的动力!