NaN和Number.NaN
NaN全称是Not-A-Number,不是一个数字。在 JavaScript 中,整数和浮点数都统称为 Number 类型。
特点1 typeof是数字
口上说不是一个数字,typeof的值却是number, 口是心非。
ES6之后,Number也多了一个静态属性NaN
- typeofNaN//number
- typeofNumber.NaN//number
特点2 我不等于我自己
我否定我自己,也就这家了。硬要说,还有一个+0和 -0
- NaN==NaN//false
- Number.NaN==NaN//false
- NaN===NaN//false
- Number.NaN===NaN//false
- +0==-0//true
- Object.is(+0,-0)//fasle
NaN的描述信息
其是一个值,新的ES标准中, 不可配置,不可枚举。也就是说不可以被删除delete,不可以被改写, 也不可以改写配置。
- deleteNaN//false
- NaN=1//1
- NaN==1//false
- deleteNumber.NaN//false
- Number.NaN=1//1
- Number.NaN==1//false
我们尝试改写:
使用Reflect.defineProperty 而不使用Object.defineProperty,因为前者能准确告诉你是否成功,而后者返回的被定义的对象。
- constsuccess=Reflect.getOwnPropertyDescriptor(window,'NaN'),{
- writable:true,
- configurable:true,
- })
- console.log(success)//false
- Reflect.getOwnPropertyDescriptor(window,'NaN')
- //{value:NaN,writable:false,enumerable:false,configurable:false}
结果是无法改写,所以不要打他的小心思。
常见的场景
计算, 类型转换是典型的场景
- letprint=console.log;
- //parseInt
- print(isNaN(parseInt("zz123")))//true
- //parseFloat
- print(isNaN(parseFloat("zz123")))//true
- //直接Number初始化
- print(isNaN(Number("zz123")))//true
- //数字运算
- print(isNaN(0/0))//true
- print(isNaN(1*"zz123"))//true
- print(Math.sqrt(-1))//true
isNaN
isNaN() 是一个全局方法。
其本质是检查 toNumber 返回值, 如果是NaN,就返回 true,反之返回 false 。
可以简化为语义:
- Number.isNaN=function(val){
- returnObject.is(Number(val),NaN);
- }
toNumber 方法, 大致的逻辑如下:
le 15: ToNumber Conversions
Argument Type | Result |
---|---|
Undefined | ReturnNaN. |
Null |
Return+0相关文章
热门资讯 |