发现
今天在看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)'? }
}