为什么JavaScript中有isNaN()函数但没有isUndefined()?

时间:2014-10-17 13:38:00

标签: javascript undefined nan

为什么JavaScript中有isNaN()函数,而isUndefined()必须写为:

typeof(...) != "undefined"

有没有一点我不明白?

在我看来,写这个而不仅仅是isUndefined(testValue)非常难看。

4 个答案:

答案 0 :(得分:27)

根本不需要isUndefined()功能。 ECMAScript specification

解释了这背后的原因
  

(请注意,NaN值由程序表达式NaN生成。)在某些实现中,外部代码可能能够检测各种Not-a-Number值之间的差异,但此类行为依赖于实现;对于ECMAScript代码,所有NaN值都无法区分

isNaN()函数用作检测某些内容是否为NaN的方法,因为相等运算符不起作用(正如您所期望的那样,见下文)。一个NaN值不等于另一个NaN值:

NaN === NaN; // false
另一方面,

undefined不同,undefined值可区分:

undefined === undefined; // true

如果您对isNaN()函数的工作原理感到好奇,那么ECMAScript规范also explains this for us也是如此:

  
      
  1. 令num为ToNumber(数字)。
  2.   
  3. ReturnIfAbrupt(NUM)。
  4.   
  5. 如果num为NaN,则返回true。
  6.   
  7. 否则,返回false。
  8.         

    ECMAScript代码测试值X是否为NaN的可靠方式是X!== X形式的表达式。当且仅当X是NaN时,结果才为真。

NaN !== NaN; // true
100 !== 100; // false

var foo = NaN;
foo !== foo; // true

答案 1 :(得分:15)

用例var === undefined几乎可以在任何地方使用,但this answer所涵盖的情况除外,其中undefined被赋值,或var未定义。

从后一种情况可以清楚地看出这种功能不存在的原因。如果未定义var,则调用假定的函数isUndefined(var)将导致ReferenceError。然而,引入新的关键字,例如isundefined var可以解决此问题。

但是尽管有效,但上述两种情况都是javascript的不良用法。这就是我认为这样的关键字不存在的原因。

答案 2 :(得分:4)

isUndefined可以写成

testValue === undefined

喜欢其他所有价值。

这不适用于NaN,而是NaN !== NaN。如果无法使用比较,则需要isNaN函数来检测NaN值。

答案 3 :(得分:0)

这不是对问题的直接回答,正如其他人已经回答的那样,更重要的是突出显示包含isUndefined()函数的库,以供任何寻求快速解决方案的人使用,并且他们可以使用它们。

Underscore和Lo-dash都包含一个isUndefined()函数,后者,因为它是基于Underscore构建的。