尽管函数的名称在isNaN
语义上指的是值isNaN
,但本机实现会返回true
一些非NaN
对象,如undefined
or {}
。
isNaN(undefined);
=> true
我认为,例如,下划线的实现更加直观/合乎逻辑:
_.isNaN(undefined);
=> false
为什么 ECMA 标准规定了这种违反直觉的行为?
为什么他们不设计仅在要测试的值确实为
真时才isNaN
返回,并留下负担在单独的函数上测试可转换为数字的负担?true
isNaN
isNumber
这样做会带来更多优势,例如在测试数字时不会出现双重否定:
if (isNumber(x)) { } // if x is a number
代替
if (!isNaN(x)) { } // if x is not not a number
由于他们将Number.isNaN()
在 ECMAScript 6 中引入(它完全符合您的期望),看起来有更多人这样想。
那么,为什么他们isNaN
首先要设计它的方式呢?这只是一个错误的决定还是有充分的理由这样做?