【TS】NaN与Typescript

1,069 阅读1分钟

发现

今天在看Ts最新版本的规范时候,注意到提到了NaN相关内容(Checks For Equality on NaN),想起了一直在编程和面试中会被提到的NaN比较问题。

过程

Ts介绍中提到,在某些背景下,NaN标志着“并非一个数字”,没有什么和NaN相等,即使是NaN。

NaN === 0 false
NaN == NaN false
NaN === NaN false

同时任何数值也不等于NaN

NaN !== 0 true
NaN != NaN true
NaN !== NaN true

然而这并不是JS特有的问题,任何包含IEEE-754浮点数都有相同的问题。但这个问题在Js中特别常见,因为JS中number类型是一个浮点数。

这也在关于Ts可以实现关于NaN的类型安全的讨论中被提到,本篇文通过类型定义讨论Ts是否有可能实现关于NaN的判断。

回到新版本介绍中,ts建议使用Number.isNaN来进行NaN值判断,这也是lodash中_.isNaN所使用的方法,为了更进一步的"引导"用户使用,现在Ts在直接对包含NaN的比较 表达式报错

function isNaN(value:number){
     return value === NaN 
     // error: This condition will always return 'true'. // Did you mean '!Number.isNaN(someValue)'? }
}

参考

  1. Ts4.9版本发布
  2. lodash-NaN
  3. Ts能否对NaN判断
  4. IEEE 754