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