2014-10-17 73 views
24

为什么会出现一个isNaN()功能在JavaScript而isUndefined()必须写成:为什么JavaScript中有isNaN()函数,但没有isUndefined()?

typeof(...) != "undefined" 

有一点我不明白?

在我看来,它真的很难写,而不仅仅是isUndefined(testValue)

+6

好问题。但我认为这在Programmers SE(概念性的东西)中更好。此外,像Underscore这样的实用程序库有['_.isUndefined'](http://underscorejs.org/#isUndefined) – Joseph 2014-10-17 13:39:45

+4

在stackoverflow非常失望。没有人烦恼完整地阅读这个问题。 – simonzack 2014-10-17 13:47:00

+15

@simonzack这是一个愚蠢的问题。为什么*应该*有一个'isUndefined()'?为什么不是'isNull()'呢?或'isEmptyString()'?或者'is17()'就是这个问题? – Pointy 2014-10-17 13:48:36

回答

15

用例var === undefined几乎无处不在的工作原理,除了由this answer,其中任undefined被分配一个值,或var未定义所覆盖的情况。

这样的功能可以不存在的原因,是由后者的情况下清晰。如果var未定义,则调用假设函数isUndefined(var)将导致ReferenceError。然而,引入新的关键字,例如isundefined var可以解决这个问题。

但尽管是有效的,上述两种情况都是JavaScript的贫困用途。这是我相信这样一个关键字不存在的原因。

+0

通过引用变量存在的现有作用域,您可以解决* if var是'undefined' *问题。如果变量是全局变量,我们可以通过传递'window.foo'或者window ['foo']'(其中'foo'是我们未定义的变量)而不是'foo'来检查它是否是未定义的。这里是我们的函数:'function isUndefined(val){return val === undefined; }',这里是我们的测试:'isUndefined(window.foo);'结果将是'true',因为没有定义全局'foo'变量。 – 2014-10-17 14:17:38

+0

@JamesDonnelly这相当于'window.foo === undefined',其中imo并没有真正回答这个问题,它要求'typeof'方法的替代方法。 – simonzack 2014-10-17 14:20:33

+9

'isUndefined()'不存在的原因是因为它不是必需的。正如Pointy回答你对这个问题的评论,如果我们有一个'isUndefined()'为什么我们不会有'isNull()'或'is17()'。 isNaN()是必要的,因为NaN值彼此不可区分。 'NaN'不等于'NaN'。 'undefined',另一方面,*等于undefined。 – 2014-10-17 14:23:04

3

isUndefined可以写成

testValue === undefined 

像所有其他价值。

然而,这不适用于NaN,因为NaN !== NaN。如果没有使用比较的能力,则需要使用isNaN函数来检测NaN值。

27

根本不需要isUndefined()功能。这背后的原因是在ECMAScript specification解释:

(注意,NaN的值由程序表达的NaN产生)。在一些实施方式中,外部代码可能能够检测各种不-A之间的差 - 数值,但是这种行为是依赖于实现的;到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. ReturnIfAbrupt(num)。
  3. 如果num是NaN,则返回true。
  4. 否则,返回false。

为ECMAScript的代码来测试一个值是否X是NaN的形式X的表达的可靠方式!== X的结果将是当且仅当X是NaN。

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

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

NaN === NaN'为false实际上正是你为什么不需要'isNaN'的原因。正如你所引用的文档所说的那样,测试'NaN!== NaN'就足够了。因此,说'isUndefined()'不存在是没有用的,因为它不是必需的,因为'isNaN()'确实存在并且完全没有用处。 – 2014-10-17 15:26:57

+11

@LightnessRacesinOrbit不是真的。为了比较'NaN','isNaN()'函数将该值与自身进行比较。调用'isNaN(myReallyLongObject.myReallyLongVariableName)'比调用'myReallyLongObject.myReallyLongVariableName!== myReallyLongObject.myReallyLongVariableName'更加可取。使用'undefined',你只需'myReallyLongObject.myReallyLongVariableName === undefined'。该检查不是'variable!== NaN',它是'variable!== variable'。这会让事情变得混乱,而'isNaN()'方法会告诉你到底是在检查什么。 – 2014-10-17 15:29:33

+0

@詹姆斯,你应该添加最后一部分给你的答案。至于为什么有'isNaN()'函数是有道理的。人们可以把'x!== x'放在整个地方,但是可能不太清楚,只是看看它的用途是什么,因此在使用中会带来更大的混淆和错误风险。 isNaN()'很清晰。 – 2014-10-17 17:24:17

相关问题