大家好,欢迎来到IT知识分享网。
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类型。
关于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(" ");
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/146991.html