为什么JavaScript中有isNaN()
函数,而isUndefined()
必须写为:
typeof(...) != "undefined"
有没有一点我不明白?
在我看来,写这个而不仅仅是isUndefined(testValue)
非常难看。
答案 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也是如此:
- 令num为ToNumber(数字)。
- ReturnIfAbrupt(NUM)。
- 如果num为NaN,则返回true。
- 否则,返回false。
醇>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构建的。