为什么会出现一个isNaN()
功能在JavaScript而isUndefined()
必须写成:为什么JavaScript中有isNaN()函数,但没有isUndefined()?
typeof(...) != "undefined"
有一点我不明白?
在我看来,它真的很难写,而不仅仅是isUndefined(testValue)
。
为什么会出现一个isNaN()
功能在JavaScript而isUndefined()
必须写成:为什么JavaScript中有isNaN()函数,但没有isUndefined()?
typeof(...) != "undefined"
有一点我不明白?
在我看来,它真的很难写,而不仅仅是isUndefined(testValue)
。
用例var === undefined
几乎无处不在的工作原理,除了由this answer,其中任undefined
被分配一个值,或var
未定义所覆盖的情况。
这样的功能可以不存在的原因,是由后者的情况下清晰。如果var
未定义,则调用假设函数isUndefined(var)
将导致ReferenceError
。然而,引入新的关键字,例如isundefined var
可以解决这个问题。
但尽管是有效的,上述两种情况都是JavaScript的贫困用途。这是我相信这样一个关键字不存在的原因。
通过引用变量存在的现有作用域,您可以解决* 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
@JamesDonnelly这相当于'window.foo === undefined',其中imo并没有真正回答这个问题,它要求'typeof'方法的替代方法。 – simonzack 2014-10-17 14:20:33
'isUndefined()'不存在的原因是因为它不是必需的。正如Pointy回答你对这个问题的评论,如果我们有一个'isUndefined()'为什么我们不会有'isNull()'或'is17()'。 isNaN()是必要的,因为NaN值彼此不可区分。 'NaN'不等于'NaN'。 'undefined',另一方面,*等于undefined。 – 2014-10-17 14:23:04
isUndefined
可以写成
testValue === undefined
像所有其他价值。
然而,这不适用于NaN
,因为NaN !== NaN
。如果没有使用比较的能力,则需要使用isNaN
函数来检测NaN
值。
根本不需要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也:
- 让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
NaN === NaN'为false实际上正是你为什么不需要'isNaN'的原因。正如你所引用的文档所说的那样,测试'NaN!== NaN'就足够了。因此,说'isUndefined()'不存在是没有用的,因为它不是必需的,因为'isNaN()'确实存在并且完全没有用处。 – 2014-10-17 15:26:57
@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
@詹姆斯,你应该添加最后一部分给你的答案。至于为什么有'isNaN()'函数是有道理的。人们可以把'x!== x'放在整个地方,但是可能不太清楚,只是看看它的用途是什么,因此在使用中会带来更大的混淆和错误风险。 isNaN()'很清晰。 – 2014-10-17 17:24:17
这不是直接回答这个问题,正如其他人已经回答了,它更强调的是包含任何人寻找快速解决方案的isUndefined()函数库和他们在使用它们的位置。
下划线和Lo-破折号都含有isUndefined()函数,后者,因为它是在下划线建。
好问题。但我认为这在Programmers SE(概念性的东西)中更好。此外,像Underscore这样的实用程序库有['_.isUndefined'](http://underscorejs.org/#isUndefined) – Joseph 2014-10-17 13:39:45
在stackoverflow非常失望。没有人烦恼完整地阅读这个问题。 – simonzack 2014-10-17 13:47:00
@simonzack这是一个愚蠢的问题。为什么*应该*有一个'isUndefined()'?为什么不是'isNull()'呢?或'isEmptyString()'?或者'is17()'就是这个问题? – Pointy 2014-10-17 13:48:36