服务器之家

服务器之家 > 正文

NaN你都未必懂,花五分钟让你懂得不能再懂

时间:2021-10-26 22:05     来源/作者:云的程序世界

NaN你都未必懂,花五分钟让你懂得不能再懂

NaN和Number.NaN

NaN全称是Not-A-Number,不是一个数字。在 JavaScript 中,整数和浮点数都统称为 Number 类型。

特点1 typeof是数字

口上说不是一个数字,typeof的值却是number, 口是心非。

ES6之后,Number也多了一个静态属性NaN

  1. typeofNaN//number
  2. typeofNumber.NaN//number

特点2 我不等于我自己

我否定我自己,也就这家了。硬要说,还有一个+0和 -0

  1. NaN==NaN//false
  2. Number.NaN==NaN//false
  3. NaN===NaN//false
  4. Number.NaN===NaN//false
  5. +0==-0//true
  6. Object.is(+0,-0)//fasle

NaN的描述信息

其是一个值,新的ES标准中, 不可配置,不可枚举。也就是说不可以被删除delete,不可以被改写, 也不可以改写配置。

NaN你都未必懂,花五分钟让你懂得不能再懂

  1. deleteNaN//false
  2. NaN=1//1
  3. NaN==1//false
  4. deleteNumber.NaN//false
  5. Number.NaN=1//1
  6. Number.NaN==1//false

我们尝试改写:

使用Reflect.defineProperty 而不使用Object.defineProperty,因为前者能准确告诉你是否成功,而后者返回的被定义的对象。

  1. constsuccess=Reflect.getOwnPropertyDescriptor(window,'NaN'),{
  2. writable:true,
  3. configurable:true,
  4. })
  5. console.log(success)//false
  6. Reflect.getOwnPropertyDescriptor(window,'NaN')
  7. //{value:NaN,writable:false,enumerable:false,configurable:false}

结果是无法改写,所以不要打他的小心思。

常见的场景

计算, 类型转换是典型的场景

  1. letprint=console.log;
  2. //parseInt
  3. print(isNaN(parseInt("zz123")))//true
  4. //parseFloat
  5. print(isNaN(parseFloat("zz123")))//true
  6. //直接Number初始化
  7. print(isNaN(Number("zz123")))//true
  8. //数字运算
  9. print(isNaN(0/0))//true
  10. print(isNaN(1*"zz123"))//true
  11. print(Math.sqrt(-1))//true

isNaN

isNaN() 是一个全局方法。

其本质是检查 toNumber 返回值, 如果是NaN,就返回 true,反之返回 false 。

可以简化为语义:

  1. Number.isNaN=function(val){
  2. returnObject.is(Number(val),NaN);
  3. }

toNumber 方法, 大致的逻辑如下:

le 15: ToNumber Conversions

Argument Type Result
Undefined ReturnNaN.
Null Return+0
标签:
Nan 

相关文章

热门资讯

返回顶部