前言
NaN我们都知道是not a number的意思,但是除此之外你真的了解NaN吗?在这里我们来系统的说一下NaN身上的特点和一些面试中可能会考到的地方。
NaN
首先NaN是Not a Number的缩写,他是一个特殊的Number值,这点尤其注意+
js
console.log(typeof NaN === "number"); // logs "true"
一般在应当返回一个number而没有返回一个number类型的值的时候就会返回一个NaN。在MDN上说有5种情况会返回一个NaN
- 失败的数字转换(例如,显式转换,如
parseInt("blabla")
、Number(undefined)
,或隐式转换,如Math.abs(undefined)
) - 计算结果不是实数的数学运算(例如,
Math.sqrt(-1)
) - 不定式(例如,
0 * Infinity
、1 ** Infinity
、Infinity / Infinity
、Infinity - Infinity
) - 一个操作数被强制转换为
NaN
的方法或表达式(例如,7 ** NaN
、7 * "blabla"
)------这意味着NaN
具有传染性 - 将无效值表示为数字的其他情况(例如,无效的 [Date]
new Date("blabla").getTime()
、"".charCodeAt(1)
)
另外有几种情况要特别说一下,
js
console.log(5/0); // logs Infinity
console.log(-5/0); // logs -Infinity
console.log(0/0); // logs NaN
- NaN和任何值相加都等于NaN(undefined和null以及它本身都是返回NaN)
- NaN和任何值都不相等,包括他自己
console.log(NaN === NaN); // logs false
如何判断一个NaN
- isNaN()
- Number.isNaN()
- value !== value 判断NaN大致就是这三种办法,首先第一个isNaN,它会将值先转换成Number类型,如果能够转换成数字则为false,否则为true
js
console.log(isNaN('2')); // logs false
console.log(isNaN(NaN)); // logs true
console.log(isNaN('a')); // logs true 字符a无法转换为数字
接着Number.isNaN()他是不会对值进行一个转换的,他会直接判断该值是否是NaN。
js
console.log(Number.isNaN('2')); // logs true
console.log(Number.isNaN(NaN)); // logs true
console.log(Number.isNaN('a')); // logs true
最后是value !== value,这个很明显吧,就是利用了NaN身上他和任何值都不相等的特性,当value !== value的时候那这个值肯定就是NaN了。
尾声
有时候这种简单的知识点容易被忽略,其中能被深挖的东西也是有的。现在大厂感觉都特别喜欢考原生js,这种东西又恰恰是很需要积累的,原生js中有着各种各样的小细节都能被拿出来考,十分建议大家都去写写各种各样的手写题,对你原生js的提升是很明显的。