javascript NaN和isNaN的理解

NaN(Not a Number) 是一个全局对象的属性,它表示未定义或不可表示的值,在编程中很少直接使用到 NaN,当算术运算返回一个未定义的或无法表示的值时,NaN就产生了。但是,NaN并不一定用于表示某些值超出表示范围的情况。将某些不能强制转换为数值的非数值转换为数值的时候,也会得到NaN。

返回NaN的运算有如下三种:
1. 操作数中至少有一个是NaN的运算
2. 未定义操作
- 下列除法运算:0/0、∞/∞、∞/−∞、−∞/∞、−∞/−∞
- 下列乘法运算:0×∞、0×-∞
- 下列加法运算:∞ + (−∞)、(−∞) + ∞
- 下列减法运算:∞ - ∞、(−∞) - (−∞)
3. 产生复数结果的实数运算。例如:
- 对负数进行开偶次方的运算
- 对负数进行对数运算
- 对比-1小或比+1大的数进行反正弦或反余弦运算

wiki NaN

typeof NaN返回number

一开始我会认为NaN表示的是一个非数字,所以typeof NaN返回的不应该是number,但其实NaN还是属于number类型,只不过用number类型无法表示而已,在ECMAScript标准中也明确定义了NaN属于Number类型。

Number type
set of all possible Number values including the special “Not-a-Number” (NaN) values, positive infinity, and negative infinity

关于typeof NaN number可以参考stackoverflow解答

NaN == NaN返回false

一般情况下一个数或者字符串和自身比较时应该返回true,但NaN和自身比较返回false,这是因为NaN表示一个无法表示的值,而这个无法表示的值可以有很多种,具体见上文。比如0/0返回NaN,0/’fail’也返回NaN,而0/0 != 0/’fail’,所以NaN == NaN返回false。

判断一个值是否是NaN

等号运算符(== 和 ===) 不能被用来判断一个值是否是 NaN。必须使用 Number.isNaN() 或 isNaN() 函数。

isNaN

isNaN() 函数用来判断一个值是否为 NaN。但是isNaN函数在判断之前会先通过ToNumber()函数强制转换,然后对强制转换后的值进行isNaN()判断。

ECMA中规定如下:

isNaN (number)
Returns true if the argument coerces to NaN, and otherwise returns false.
If ToNumber(number) is NaN, return true.
Otherwise, return false.

这样当通过isNaN()函数对字符串’abc’判断时会返回true,然而事实是字符串’abc’的type类型为string,而NaN的type类型为number,字符串’abc’不应该是NaN。但isNaN函数先通过ToNumber(‘abc’)把字符串’abc’强制转换为NaN了,所以isNaN(NaN)就返回true了。ECMA也推荐我们用x !== x返回true判断x是否为NaN。

A reliable way for ECMAScript code to test if a value X is a NaN is an expression of the form X !== X. The result will be true if and only if X is a NaN.

示例

isNaN(NaN);       // true
isNaN(undefined); // true
isNaN({});        // true

isNaN(true);      // false
isNaN(null);      // false
isNaN(37);        // false

// strings
isNaN("37");      // false: 可以被转换成数值37
isNaN("37.37");   // false: 可以被转换成数值37.37
isNaN("");        // false: 空字符串被转换成0
isNaN(" ");       // false: 包含空格的字符串被转换成0

// dates
isNaN(new Date());                // false
isNaN(new Date().toString());     // true

isNaN("blabla")   // true: "blabla"不能转换成数值
Number.isNaN()

Number.isNaN()在ES6中定义的,Number.isNaN() 方法用来检测传入的值是否是 NaN。该方法比传统的全局函数 isNaN() 更可靠。该方法不会强制将参数转换成数字,只有在参数是真正的数字类型,且值为 NaN 的时候才会返回 true。

示例

Number.isNaN(NaN);        // true
Number.isNaN(Number.NaN); // true
Number.isNaN(0 / 0)       // true

// 下面这几个如果使用全局的 isNaN() 时,会返回 true。
Number.isNaN("NaN");      // false,字符串 "NaN" 不会被隐式转换成数字 NaN。
Number.isNaN(undefined);  // false
Number.isNaN({});         // false
Number.isNaN("blabla");   // false

// 下面的都返回 false
Number.isNaN(true);
Number.isNaN(null);
Number.isNaN(37);
Number.isNaN("37");
Number.isNaN("37.37");
Number.isNaN("");
Number.isNaN(" ");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值