`
leejian
  • 浏览: 27217 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

为什么 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)声明了变量但从未赋值

 

varv1,obj = {};

 

console.log(v1);//undefined

 

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

 

typeof v1;// "undefined"

 

typeof v2;// "undefined"

 

typeof obj.get;// "undefined"

 

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

 

varb;

 

b == undefined;//true

 

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

 

varp = null;

 

console.log(p);//null

 

typeofp;// "object"

 

typeof null;// "object"

 

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

 

varobj = null;

 

obj == null;//true

分享到:
评论

相关推荐

    1.NaN是什么?

    因为NaN不代表任何数据,也就是说,它不等于任何值,当然也包括,不等于自己。 console.log(NaN==NaN); 但是它是属于Number类型。 console.log(typeof(NaN)) 为此,我们可以通过与NaN有关的一些方法,进行判断...

    JavaScript NaN和Infinity特殊值 [译]

    类型为”number” 代码如下: > typeof NaN ‘number’ 1.1 检测NaN JavaScript中,NaN是惟一一个和自己也不想等的值.所以,也就不能使用等号运算符来判断一个值是否是NaN,不过有全局函数isNaN()来干这件事.

    Pytorch训练过程出现nan的解决方式

    今天使用shuffleNetV2+,使用自己的数据集,遇到了loss是nan的情况,而且top1精确率出现断崖式上升,这显示是不正常的。 在网上查了下解决方案。我的问题是出在学习率上了。 我自己做的样本数据集比较小,就三类,...

    JavaScript中严格判断NaN的方法

    我也在FreeCodeCamp上碰到这样一道题: 删除数组中的所有假值。...只需判断变量是否与自身相等,若不等的情况,该变量的值即为NaN。 总结 以上所述是小编给大家介绍的JavaScript中严格判断NaN的方法,希望对大家有所

    浅析JavaScript中的特殊数据类型

    而对于JS来说,整数和浮点数都统称为number 类型,除此之外,number 类型还有一个很特殊的值,即NaN,它是用来表示是否属于number 类型的一种状态,而不是一个确切的值(所以,NaN不等于自身)。 那么,NaN值一般会...

    使用Pandas将inf, nan转化成特定的值

    2. 为了不让该值影响到我们,打算将inf全变成NaN,则适用replace进行计算 df.replace([np.inf, -np.inf], np.nan) 3. 举例实现: In [0]: df = pd.DataFrame([1, 2, np.inf, -np.inf]) In [1]: df.replace([np.inf...

    你必须知道的495个C语言问题

    1.2 为什么不精确定义标准类型的大小? 1.3 因为C语言没有精确定义类型的大小,所以我一般都用typedef定义int16和int32。然后根据实际的机器环境把它们定义为int、short、long等类型。这样看来,所有的问题都解决...

    《你必须知道的495个C语言问题》

    1.24 我在一个文件中定义了一个extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小? 13 声明问题 14 1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 14 *1.26 main的正确...

    C语言FAQ 常见问题列表

    o 7.18 当数组是函数的参数时, 为什么 sizeof 不能正确报告数组的大小 ? * 8. 内存分配 o 8.1 为什么这段代码不行?char *answer; printf("Type something:\n"); gets(answer); printf("You typed \"%s\"\n", ...

    安装脚本_inno脚本_Inno脚本_innosetup_nan_

    自己制作修改的一款漂亮简洁的inno setup安装脚本,本脚本使用INNO SETUP 5.0增强版

    JavaScript 更严格的相等 [译]

    1.检测NaN 在数学上,任意值x总是与自己相等: x = x 但这条规则并不适用于 === 和 NaN: 代码如下: > NaN === NaN false 导致的结果就是,你不能通过使用indexOf方法在一个包含了NaN的数组中找到这个NaN,因为该方法在...

    你必须知道的495个C语言问题(PDF)

    2.2 为什么struct x f . . . g; x thestruct; 不对? . . . . . . . . . . . . . 7 2.3 一个结构可以包含指向自己的指针吗? . . . . . . . . . . . . . . . 7 2.4 在C 语言中实现抽象数据类型什么方法最好? . . . ....

    Javascript_A_Z:在ITLab上展示的Bootcamp内容

    不等于NaN 错误通过表达式传播 值的类型仍为Number 5 *“文字” = NaN 编号(“文字”) 无限 除以0 5 *无限=无限 无限+无限=无限 无限-无限= NaN 无穷大/无穷大= NaN 数学 弦乐 0或更多16位字符的字符串 ...

    zhi-nan-zhen.rar_51单片机12864_zhen--zhi_指南针

    51单片机开发的指南针程序用12864显示,完全自己开发的,功能还不错,有需要的可以下来看看

    javascript学习笔记_浅谈基础语法,类型,变量

    非数字值的判断方法:(因为Infinity和NaN他们不等于任何值,包括自身) 1、用x != x ,当x为NaN时才返回true; 2、用isNaN(x) ,当x为NaN或非数字值时,返回true; 3、用isFinity(x),在x不是NaN、Infinity、-...

Global site tag (gtag.js) - Google Analytics