Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么JavaScript中有一个isNaN()函数,但没有isUndefined()?_Javascript_Undefined_Nan - Fatal编程技术网

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

为什么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()函数。这背后的

为什么JavaScript中有一个
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规范也会:

  • 设num为ToNumber(number)
  • ReturnIfAbrupt(num)
  • 如果num为NaN,则返回true
  • 否则,返回false
  • ECMAScript代码测试值X是否为NaN的可靠方法是形式为X!==当且仅当X为NaN时,结果为真


    用例
    var===undefined
    几乎在任何地方都可以工作,除了所涵盖的情况,其中
    undefined
    被分配了一个值,或者
    var
    未定义

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


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

    这并不是对这个问题的直接回答,因为其他人已经回答了这个问题,更重要的是要突出显示包含isUndefined()函数的库,供任何寻求快速解决方案的人使用,并且他们能够使用它们

    下划线和Lo-dash都包含一个isUndefined()函数,后者是基于下划线构建的


    好问题。但我认为这一点在程序员SE(概念性的东西)中更好。此外,像下划线这样的实用库对stackoverflow非常失望。没有人费心把这个问题通读一遍。@simonzack这是个愚蠢的问题。为什么要有一个
    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
    进行比较<另一方面,代码>未定义的可以使用相等运算符
    =
    ==
    来确定,因此这样的函数根本不需要。@JamesDonnelly
    isNaN
    非常容易实现,因此您关于它必须存在的理由是有缺陷的<代码>函数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