百度百科NaNNot a Number,非数字)是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。
虽然 NaN 是“Not a Number”,但是它的类型还是数值类型

console.log(typeof NaN === "number");  //true

NaN 和任何东西都不相等——甚至是它自己本身!

console.log(NaN === NaN);  //false

那么为什么NaN不相等呢?因为NaN表示一个非数字的数值类型

 var str = '666';
 const obj = {age:18};
 console.log(isNaN('str'));//flase;
 console.log(isNaN('666'));//false;
 console.log(isNaN(obj));//true;

为什么console.log(isNaN(‘str’))和console.log(isNaN(‘666’))会是flase?变量str和‘’不是字符串吗?其实isNaN()会先将参数转为Number 类型,(Number(),非parseInt()或Math.floor()),再判断是否为NaN ,所以在类型转换失败或运算错误时值为NaN,返回true,其他全为false,再来看一种情况

console.log(isNaN(''));//false

isNaN()在使用的时候会存在隐式转换, 其内部使用 Number() 方法尝试将操作的内容转换为数字,如果用isNaN简单的判断input的输入内容是否非数字,如果输入空字符就可能出现永远执行不到else的内容

console.log(Number(''));//0
console.log(Number(" "));//0

继续

var str = '666a';
console.log(isNaN(str));//true

在str变量中随便加入一个非数字的字符,这时结果就是true了,那么回答之前说的NaN为什么不等于NaN
==用于一般比较,===用于严格比较,==在比较的时候可以转换数据类型,===严格比较,只要类型不匹配就返回flase

var num = 666;
let strN = '666';
console.log(num == str);//true
console.log(num === str);//false

在之前定义的str和obj中,都是非数字类型都可以转换成NaN

console.log(typeof str);//string
console.log(typeof obj);//object

类型都不相等,所以NaN不等于NaN,但是有人问了同类型的就可以相等吗?转换成NaN还是不行,NaN表示的一个非法的数字,他具体是什么我们都不知道,又来一个NaN,他又是什么我们也不知道,这两个NaN原来的类型完全无法确定,所以结果肯定是false。

在ES6新的 Number.isNaN() 函数,一个不同的函数,比全局 isNaN() 函数更可靠

Logo

基于 Vue 的企业级 UI 组件库和中后台系统解决方案,为数万开发者服务。

更多推荐