NaN的实施背后的原因是什么?

Max*_*uxa 5 javascript standards ecmascript-6

虽然函数的名称在isNaN语义上与值相关isNaN,但本机实现会返回true一些非NaN对象,如undefined{}.

isNaN(undefined);
=> true
Run Code Online (Sandbox Code Playgroud)

我认为,例如,下划线的实现更加直观/合理:

_.isNaN(undefined);
=> false
Run Code Online (Sandbox Code Playgroud)

为什么ECMA标准规定了这种违反直觉的行为?

为什么他们不设计isNaN返回要测试的值是否 真的并且在单独的函数上测试convertable-to-number的负担呢?true isNaNisNumber

这样做会带来更多优势,例如在测试数字时没有双重否定:

if (isNumber(x)) { } // if x is a number
Run Code Online (Sandbox Code Playgroud)

代替

if (!isNaN(x)) { }   // if x is not not a number
Run Code Online (Sandbox Code Playgroud)

由于他们将Number.isNaN()在ECMAScript 6中引入(它完全符合你的期望),看起来有更多的人这样想.

那么,为什么他们首先设计isNaN它的方式呢?这只是一个错误的决定还是有充分的理由这样做?