为什么JavaScript中有一个isNaN()函数,但没有isUndefined()?
为什么JavaScript中有一个为什么JavaScript中有一个isNaN()函数,但没有isUndefined()?,javascript,undefined,nan,Javascript,Undefined,Nan,为什么JavaScript中有一个isNaN()函数,而isUndefined()必须写为: typeof(...) != "undefined" 有什么我不明白的吗 在我看来,写这个而不仅仅是isUndefined(testValue)isUndefined可以写成 testValue === undefined 就像其他价值观一样 但是,这不适用于NaN,因为NaN!==NaN。由于无法使用比较,因此需要一个isNaN函数来检测NaN值。根本不需要isUndefined()函数。这背后的
isNaN()
函数,而isUndefined()
必须写为:
typeof(...) != "undefined"
有什么我不明白的吗
在我看来,写这个而不仅仅是
isUndefined(testValue)
isUndefined
可以写成
testValue === undefined
就像其他价值观一样
但是,这不适用于
NaN
,因为NaN!==NaN
。由于无法使用比较,因此需要一个isNaN
函数来检测NaN
值。根本不需要isUndefined()
函数。这背后的原因解释如下:
(注意,NaN值是由程序表达式NaN生成的。)在一些实现中,外部代码可能能够检测到各种非数字值之间的差异,但这种行为取决于实现;对于ECMAScript代码,所有NaN值彼此之间都无法区分
isNaN()
函数用于检测某个对象是否为NaN
,因为等式运算符不起作用(如您所料,请参见下文)。一个NaN
值不等于另一个NaN
值:
NaN === NaN; // false
另一方面,未定义的
是不同的,未定义的
值是可区分的:
undefined === undefined; // true
如果您对
isNaN()
函数的工作原理感到好奇,那么ECMAScript规范也会:
用例
var===undefined
几乎在任何地方都可以工作,除了所涵盖的情况,其中undefined
被分配了一个值,或者var
未定义
从后一种情况可以清楚地看出,这种功能不存在的原因。如果var
未定义,则调用假定函数isUndefined(var)
将导致ReferenceError
。然而,引入一个新的关键字,例如,isundefined var
可以解决这个问题
但是,尽管上述两种情况都是有效的,但都是javascript的糟糕使用。这就是我认为这样一个关键字不存在的原因。这并不是对这个问题的直接回答,因为其他人已经回答了这个问题,更重要的是要突出显示包含isUndefined()函数的库,供任何寻求快速解决方案的人使用,并且他们能够使用它们 下划线和Lo-dash都包含一个isUndefined()函数,后者是基于下划线构建的
isUndefined()
?为什么不也使用isNull()
?或者isEmptyString()
?或者is17()
?注意不检查参数是否为NaN
。相反,它检查强制为number的参数是否为NaN
。如果要检查参数是否为NaN
,可以使用ES6。原因isUndefined()
不存在是因为它不是必需的。正如波蒂回答你对这个问题的评论时所说,如果我们有一个isUndefined()
为什么我们没有一个isNull()
或is17()
<代码>isNaN()是必要的,因为NaN值彼此无法区分NaN
不等于NaN
<另一方面,code>undefined等于undefined
。问题的标题询问为什么isNaN()
存在,而isUndefined()
不存在。您的答案根本没有提到NaN
以及为什么isNaN()
是ECMAScript的一部分,而是假设了为什么isUndefined()
不是ECMAScript的一部分isNaN()
是必需的函数,因为没有其他(简单)方法将值与NaN
进行比较<另一方面,代码>未定义的可以使用相等运算符=
和==
来确定,因此这样的函数根本不需要。@JamesDonnellyisNaN
非常容易实现,因此您关于它必须存在的理由是有缺陷的<代码>函数isNaN(x){return x!==x;}-唯一不等于它本身的事实是如何识别它。@a但您必须在需要检查值是否为NaN
的创建的每个项目中定义此函数。正如我前面提到的,检查未定义的
与值===未定义的
一样简单,而检查NaN并不像值===NaN
那么简单。isNaN()
函数比isUndefined()
函数有用得多。同样地,按照您的逻辑,当我们可以自己编写函数时,为什么要在ECMAScript中预定义任何函数呢?:-)记住,这是由ECMAScript的创建者和ECMAScript 6的编辑决定的,而不是我。@JamesDonnelly我同意你在那里所说的一切,但你之前的评论中仍然没有为“isNaN()
是必要的”辩护。这充其量只是一种方便——绝对不是必要的。事实上,NaN===NaN
是假的,这正是你不需要isNaN
的原因。正如您引用的文档所述,测试NaN!==NaN
完全足够了。因此,说isUndefined()
不
NaN !== NaN; // true
100 !== 100; // false
var foo = NaN;
foo !== foo; // true