微信号:FrontDev

介绍:分享 Web 前端相关的技术文章、工具资源、精选课程、热点资讯

为什么 NaN 不等于自身?

2016-03-20 20:17 前端大全

(点击上方,可快速关注)


作者:一像素 

网址:http://www.cnblogs.com/onepixel/p/5281796.html


NaN 即 Not a Number , 不是一个数字, 那么NaN到底是什么呢? 话说在JavaScript中,有6大数据类型,分别包括string,number,boolean,undefined,null和object, 而对于JS来说,整数和浮点数都统称为number类型,除此之外,number类型还有一个很特殊的值,即NaN, 它是用来表示是否属于number类型的一种状态: 是或否。而不是一个确切的值。 


那么,NaN值一般会在什么情况下出现呢?一般有两种情况:


(1) 一个表达式中如果有减号(-)、乘号(*) 或 除号(/) 等运算符时,JS引擎会在计算之前试图将运算符两边的变量转化为number类型,如果转化失败,表达式将返回NaN


(2) 直接使用 parseInt, parseFloat 或 Number 将一个非数字的值转化为数字时,表达式返回NaN


"abc" - 3   // NaN

 

parseInt("abc")  // NaN

 

parseFloat("abc") //NaN

 

Number("abc")    //NaN


当一个表达式返回了NaN 时,表示该表达式中存在不可以转化的变量,并返回了无效的结果,并不是返回了一个确切的值。


如果非要说NaN是一个值得话,那么 NaN 就是除过数字的任意值,但绝不是确切的某一个值!


如果你还不理解,我们还可以用正则表达式来描述NaN值: [^d]


所以 NaN != NaN , 因为它是一个范围,而不能代表一个确定的值



除此之外,与NaN相关的还有一个函数,即 isNaN() , 它是用来判断某一个变量是不是数字或能否转化为数字,仅此而已。


isNaN(123) //false

 

isNaN("123") //false

 

isNaN("abc") //true

 

isNaN("ab3") //true

 

有的朋友可能对NaN理解有偏差,想不明白下面这个问题:


既然 isNaN("abc") //true

 

那么 "abc" == NaN  也应该为true,


于是就觉得isNaN()不靠谱,然后自己封装函数来判断一个变量是否真正为NaN, 你想想, NaN连自身都不认,你指望它和谁相等?


说到这里,有的朋友是不是想起了undefined和null, 好不容易理解 NaN 是怎么回事,此时此刻,有木有觉得越来越不懂undefined和null了, 那我就顺便聊一下他们吧~


undefined是JavaScript中6种数据类型中的一种,该类型只有一个值,也就是undefined。 undefined意为未定义,即当使用var声明了变量但未进行赋值时,这个变量的值就是undefined。undefined产生的原因有两种:


(1)访问对象不存在的属性或方法


(2)声明了变量但从未赋值


var v1,obj = {};

 

console.log(v1); //undefined

 

console.log(obj.get); //undefined

 

typeof v1; // "undefined"

 

typeof v2; // "undefined"

 

typeof obj.get; // "undefined"


和NaN不同的是,undefined虽然也代表变量的一个状态,但这个状态值是确定唯一的,即当一个变量声明了但没有赋值时,它的状态就是undefined,因此下面表达式是成立的:


var b;

 

b == undefined; //true


理解了undefined以后,再理解null就容易多了,null类型也只有一个值:null , 表示一个变量中没有包含有效数据。null在这里意为空值、空对象的意思,更确切的说,一个被赋值为null的变量没有保存有效的数值、字符串、布尔、数组或对象等,可以通过给一个变量赋值为null来清空变量中的内容。产生null的原因只有一个:即对一个变量显式的赋值为null 。


var p = null;

 

console.log(p); //null

 

typeof p ; // "object"

 

typeof null; // "object"


还是和NaN来比较,null也是一个确定切唯一的状态值,当一个变量被赋值为null时,那么它就和null相等,因此下面表达式也是成立的:


var obj = null;

 

obj == null; //true



【今日微信公号推荐↓】

更多推荐请看值得关注的技术和设计公众号


其中推荐了包括技术设计极客 和 IT相亲相关的热门公众号。技术涵盖:Python、Web前端、Java、安卓、iOS、PHP、C/C++、.NET、Linux、数据库、运维、大数据、算法、IT职场等。点击《值得关注的技术和设计公众号》,发现精彩!


 
前端大全 更多文章 详解Javascript中的Object对象 结合个人经历总结的前端入门方法 前端不为人知的一面–前端冷知识集锦 一份优秀的前端开发工程师简历是怎么样的? 浅谈Web缓存
猜您喜欢 我的天哪 | 如此神人 夫复何求 API 调用次数限制实现 旅行带给我的童年生活 用Swift搭建数据驱动型iOS架构 #考察# PHP面试题目搜集--合格的PHPer必过