为什么 NaN 不等于自身?

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

(关于JS数据类型更多讲解请参考:http://www.cnblogs.com/onepixel/p/5140944.html )

@一像素 2016 博客园

原文地址:http://www.cnblogs.com/onepixel/p/5281796.html

时间: 2024-10-13 23:23:10

为什么 NaN 不等于自身?的相关文章

NaN不等于NaN

[TOC] 不知道这个小知识点用得多不多,曾经在书上看到过,所以有一些印象,前段时间顺手写出类似如下的代码 var result; if (parseInt('abc')==NaN) { return "相等"; } else { return "不等"; } 断点调试之后发现无论如何都不相等,方法parseInt()返回的结果确实是NaN,但是与右侧的NaN比较返回的结果却是false,这时候才突然想起来NaN有不等于自身的特性,所以简单收集一下资料做个整理 原因

关于NaN(Not a Number)的问题

在游戏运行时,代码若写得不安全很容易出现NAN的异常.一旦NAN出现整个游戏不崩溃也坏死掉了,游戏上了则是要被直接打回来的节奏,更是一个开发及测试人员每人都要扣3000块的大BUG. 一般表现为: 1. transform.rotation assign attempt for "XXX" is not valid. Input rotation is {NaN, NaN, NaN, NaN}. 2. Getting an error of rigidbody.force assign

2016.8.01 "" null undefined NaN 0 特殊比较是true还是false

在javascript的世界里,无论是函数,还是数组,还是对象,亦或是字符串,数字,布尔类型,在这些数据类型中,总有这么几个特立独行,然后造成一些可有可无的讨厌bug. 而这些讨厌bug出现的原因就是由于比较时产生的错误,而且最不易查出错误. 在这里我们整理了这几个特殊数据类型的比较.直接上代码. 上代码前,普及一个知识: ==内容比较,数据类型不比较. ===内容比较,数据类型也比较. 上代码: ==比较代码: // "" null undefined NaN 0 console.l

java中Infinity(无限)和NaN

1.i == i + 1 一个数字永远不会等于它自己加1?Java 强制要求使用IEEE 754 浮点数算术运算[IEEE 754],它可以让你用一个double 或float来表示无穷大.正如我们在学校里面学到的,无穷大加1还是无穷大. 你可以用任何被计算为无穷大的浮点算术表达式来初始化i,例如: double i = 1.0 / 0.0; 不过,你最好是能够利用标准类库为你提供的常量: double i = Double.POSITIVE_INFINITY; 事实上,你不必将i 初始化为无穷

JS中undefined、null以及NaN之间的区别,以及对象属性赋值的面试题

(1)以下三种情况typeof 返回类型为undefined --当变量未初始化时 --变量未定义时 --函数无明确返回值时(函数没有返回值时返回的都是undefined) (2)Null 类型 undefined 是由null派生处理的,因此undefined == null undefined 是声明了但是没有初始化的该变量, null表示尚未存在的对象 . (3)NaN 值 是一个特殊值,表示非数(Not a Number),类型转换失败就会返回NaN --NaN 不等于自己,即 NaN

javascript Null、Undefined 、NaN的联系与区别

相信许多初学 javascript 都会有这种想法: 为什么 javascript 有 null 又有 undefined ,相对 C , C++ ,Java ,他们都是只有 null 而已,为什么 javascript 就不同 一.历史原因 通过网络搜索得知,1995年JavaScript诞生时,最初像Java一样,只设置了null作为表示"无"的值.根据C语言的传统,null被设计成可以自动转为0. 但是,JavaScript的设计者Brendan Eich,觉得这样做还不够,有两

[Unity3D]关于NaN(Not a Number)的问题

在游戏运行时,代码若写得不安全很容易出现NAN的异常.一旦NAN出现整个游戏不崩溃也坏死掉了,游戏上了则是要被直接打回来的节奏,更是一个开发及测试人员每人都要扣3000块的大BUG. 一般表现为: 1. transform.rotation assign attempt for "XXX" is not valid. Input rotation is {NaN, NaN, NaN, NaN}. 2. Getting an error of rigidbody.force assign

javascript的优美与鸡肋

--总结来自:<javascript语言精粹> 任何语言都有其优美的地方和其鸡肋的地方.避归一些语言的糟粕,能相应的降低bug出现的几率. 优美处: 函数是头等对象 基于原型继承的动态对象 对象字面量和数组字面量 糟粕: 1. 全局变量 全局变量有三种表达方式: var声明:var foo = value; 添加属性到全局对象上,即添加到window上:window.foo = value; 未经声明的变量:foo = value; 虽然变量可以未经声明就使用,但是这会导致后期的很多的bug出

《JavaScript语言精粹》笔记

Function.prototype.method=function(name,func){    this.prototype[name]=func;    return this;}//1.注释最好使用双斜杠而不是带*斜杠/*2.数字,js不区分整数类型,1和1.0是相等的 * NaN是一个数值,它表示一个不能产生正常结果的运算结果.NaN不等于任何值,包括它自己,可用isNaN(number)检查 * 值Infinity表示所有大于1.79769313486231570e+308的值 */