`

为什么 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
1
2
3
4
5
6
7
"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
1
2
3
4
5
6
7
isNaN(123) //false

isNaN("123") //false

isNaN("abc") //true

isNaN("ab3") //true


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


既然 isNaN("abc") //true

那么 "abc" == NaN  也应该为true,
1
2
3
既然 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"
1
2
3
4
5
6
7
8
9
10
11
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
1
2
3
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"
1
2
3
4
5
6
7
var p = null;

console.log(p); //null

typeof p ; // "object"

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


var obj = null;

obj == null; //true
1
2
3
var obj = null;

obj == null; //true
分享到:
评论

相关推荐

    nan_test_python_NAN_

    首先,`NAN`不是一个固定的数值,它是一个浮点数类型(`float`),但不等于任何其他浮点数,包括自身。你可以通过以下方式来检查一个数是否为`NAN`: ```python import math def is_nan(value): return math....

    1.NaN是什么?

    有趣的是,对于`Set`而言,即使`NaN`在数学上被认为是不等于自身的,但在`Set`中,两个`NaN`值被视为相等。因此,如果你向`Set`添加两个`NaN`,`Set`的大小将会是`1`,而不是`2`。下面的代码展示了这一点: ```...

    Python Numpy:找到list中的np.nan值方法

    由于`np.nan`不等于任何其他值,包括自身,所以在常规比较操作中,`np.isnan()`函数被用来检查一个值是否为`np.nan`。 以下是一个简单的示例,展示了如何在列表中查找`np.nan`值: ```python import numpy as np ...

    js判断undefined类型,undefined,null,NaN的区别

    在比较运算中,NaN 和任何值都不相等,包括自己。例如: ```javascript var a = NaN; alert(a == a); // false ``` 比较运算 在比较运算中,需要注意以下几点: * undefined 和 null 被认为是相等的。 * NaN 和...

    ActionScript Number(NaN) —> java(null) NaN —> null

    在ActionScript中,NaN与任何值都不相等,包括它自身,这使得检查一个值是否为NaN变得复杂。 当ActionScript的数据通过AMF(Action Message Format)或其他序列化机制传递到Java端时,问题就出现了。由于Java的...

    深入探讨JavaScript中的NaN检测技巧

    由于NaN的特殊性质,直接使用等于操作符(== 或 ===)来检测一个值是否为NaN会失败,因为NaN不等于任何值,包括它自己。因此,正确检测NaN的方法变得尤为重要。本文将详细探讨在JavaScript中检测NaN的各种技巧,并...

    compiler_nan_

    处理NaN时,需要特别注意其特性,比如它不等于自身,任何涉及NaN的操作都会返回NaN。 标签"nan"进一步确认了我们要关注的焦点。在编程中,处理浮点数时遇到NaN,需要理解IEEE 754浮点数标准,这个标准定义了如何...

    JavaScript中严格判断NaN的方法

    此外,由于NaN的特殊性,需要注意的是,在使用等值比较(==)时,NaN被视为与其他任何值(包括它自己)都不相等,这可能会导致在判断时出错。因此,在需要严格判断NaN时,应该使用严格等值比较(===)。 最后,值得...

    对pandas数据判断是否为NaN值的方法详解

    在Python中,直接使用 `==` 或 `in` 操作符无法正确判断一个值是否为NaN,因为NaN不等于自身,这就是为什么我们需要使用`pd.isnull()`的原因。 在上面的`age_map`函数中,我们看到如何结合`pd.isnull()`来进行条件...

    在JavaScript中使用NaN值的方法

    `NaN`的特性之一是它不等于自身,即`NaN !== NaN`。这是因为设计上的考虑,使得在比较`NaN`时能明确其不确定性,避免因为误判而产生错误。在检测一个值是否为`NaN`时,不能简单地使用`==`或`===`进行比较,因为这些...

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

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

    JavaScript NaN和Infinity特殊值 [译]

    值得注意的是,NaN具有其独特的特性:它不等于任何值,包括自身。这意味着`NaN !== NaN`的比较结果是`true`。这种特性使得直接使用相等运算符检查一个值是否为NaN变得困难。然而,JavaScript提供了一个全局函数`...

    matlab开发-与NAN的自相关和部分自相关

    在存在NAN值的情况下,传统的自相关函数计算可能受到严重影响,因为NAN不等于任何其他数值,包括自身,这会导致错误的结果。MATLAB中的`nanautocorr.m`文件很可能是一个实现处理NAN值的自相关函数的脚本。它可能会...

    JS中判断null、undefined与NaN的方法

    NaN与任何值(包括其自身)相比都是false,因此不能使用等号==或严格等于===来判断一个值是否为NaN。正确的做法是使用isNaN()函数: ```javascript var tmp = 0 / 0; if(isNaN(tmp)) { alert("NaN"); } ``` 除了...

    grap_nan.zip

    【标题】"grap_nan.zip" 提供的是一款名为 "grap_nan" 的软件或库的源代码。从文件名可以推测,这可能是一个与图形处理或者数据分析相关的项目,特别是因为 "nan" 通常在编程中代表 "Not a Number",暗示这个项目...

    JavaScript Undefined,Null类型和NaN值区别

    判断一个值是否为`NaN`时,不能直接用`==`或`===`,因为`NaN`不等于任何值,包括它自己。因此,应该使用全局函数`isNaN()`来检测: ```javascript console.log(isNaN(num)); // 输出 true ``` 总结来说,`undefined...

    python2与python3中关于对NaN类型数据的判断和转换方法

    因此,我们不能使用`==`来判断一个值是否为NaN。正确的做法是使用`np.isnan()`函数或者`is`关键字来判断。 在进行数据处理时,如果需要将包含NaN的数据转换为整数类型,一种方法是使用条件语句来判断该值是否为NaN...

    JINNAN日系旅社网页模板

    【JINNAN日系旅社网页模板】是一款专为旅社或民宿设计的网页模板,具有鲜明的日系风格和简约精致的界面设计。这款模板适用于想要创建吸引人的在线展示平台,以展示其住宿服务、设施和周边景点的商家。通过使用这样的...

Global site tag (gtag.js) - Google Analytics