1、NaN是什么?
NaN(Not a Number),是number数值类型的一类值,表示未定义或不可表示的值。
2、NaN是如何产生的?
它是在执行算术运算时,产生的一种结果:对不同数据类型进行算术运算就会产生NaN(一部分会产生)。
看代码:
<script>
//非数值字符串- 非字符串类型 == NaN
console.log("aaa"-100) //NaN
console.log("aaa"-true) //NaN
console.log("aaa"-"bbb") //NaN
//运算中有NaN,结果是NaN
console.log(100+NaN) //NaN
console.log(true+NaN) //NaN
//非数值字符串 + 非字符串类型 == 字符串拼接
console.log(NaN+"111") //NaN111
//数值字符串 - 非字符串类型 == 正常运算
console.log("111"-true) //110
console.log("111"-100) //11
//number+-Boolean == 正常运算
console.log(222-true) //221
console.log(true+22) //23
</script>
如果算术运算中有一方是NaN,在另外一方不是字符串的情况下,结果是NaN;
如果算术运算中一方是 非数值字符串,不管另外一方是什么数据类型,在进行 相减的运算中,结果都是NaN。
字符串和任何数据类型相加都会进行字符串拼接,结果是字符串类型,跟NaN相加的结果也是字符串。
3、isNaN()检测一个值是否等于NaN?
它的原理是:在检测时,先把参数用Number转换成数值类型,然后再判断是不是NaN。
代码:
<script>
console.log(isNaN(111)) //false
console.log(isNaN(true)) //false
console.log(isNaN("111")) //false
console.log(isNaN([1])) //false 数组一个值是false
console.log(isNaN([])) //false
console.log(isNaN("aaa")) //true 字符串
console.log(isNaN(NaN)) //true 数值
console.log(isNaN({name:"yiyi"})) //true 对象
console.log(isNaN([1,2,3])) //true 数组多个值是true
console.log(isNaN(["aaa","bbb","ccc"])) //true 数组
</script>
isNaN("aaa") // true
// 相当于
isNaN(Number("aaa")) // true
除了NaN本身是true之外,字符串,对象,多值数组都是true。
所以在使用isNaN之前,最好先判断一个数据类型。
注意:NaN不等于它本身NaN
NaN==NaN //false
NaN===NaN //false
但是isNaN这个办法判断不准确,很多类型都可以是true,如果想要更准确判断是不是NaN本身,用Number.isNaN这个办法:只有NaN本身才为true。
console.log(Number.isNaN("111")) //false
console.log(Number.isNaN(111)) //false
console.log(Number.isNaN(NaN)) //true