如何最好地将一个值与“undefined”进行比较?

9

这两者之间有什么不同吗?

var a;
(a == undefined)
(a === undefined)
((typeof a) == "undefined")
((typeof a) === "undefined")

我们应该使用哪个?


https://dev59.com/9HE85IYBdhLWcg3wl0nF 看起来与这个问题相关。 - borrible
1
可能是重复的问题:Javascript: undefined !== undefined? - Amir Raminfar
6个回答

11

具有讽刺意味的是,在JavaScript中undefined可以被重新定义,虽然没有理智的人会这样做,例如:

undefined = "LOL!";

如果使用undefined进行未来的相等性检查,将会产生意外的结果!

至于=====(相等运算符)之间的区别,==会尝试将一个类型的值强制转换为另一个类型,在英语中,这意味着0 == "0"将被计算为true,即使它们的类型不同(Number vs String) - 开发人员倾向于避免使用这种松散的相等性,因为它可能导致难以调试的错误。

因此,最安全的做法是使用:

"undefined" === typeof a

在检查未定义时 :)


2
({tries undefined = true}) 谁会在他们的代码中...为什么要...啊!为什么有人会这样做?这是EcmaScript的真正失败。我甚至从未想过要这样做。 - cwallenpoole
根据我的例子,“for teh lolz!” EcmaScript的下一个版本(代号Harmony)将包括对常量的支持,这对我们的理智来说只会是一件好事;) http://wiki.ecmascript.org/doku.php?id=harmony%3aconst - JonnyReeves
这是你回答的第一部分链接:https://dev59.com/9HE85IYBdhLWcg3wl0nF#2703131 - JohnJohnGa

1
我个人喜欢使用 <\p>。
[undefined, null].indexOf(variable) > -1

还要检查空值。


0
var a;
(a == undefined) //true
(a === undefined) //true
((typeof a) == "undefined") //true
((typeof a) === "undefined") //true

但是:

var a;
(a == "undefined") //false
(a === "undefined") //false
((typeof a) == undefined) //false
((typeof a) === undefined) //false

@JohnJohn 如果它们都产生相同的结果,那就没有“差异”。但我认为最好的选择是你的第二个选项。 - Naftali

0

你应该使用上述提到的内容:

"undefined" === typeof a

但是如果你有很多变量要检查,你的代码可能会变得很丑陋,所以你可以考虑使用Java的方法:

try { vvv=xxx; zzz=yyyy; mmm=nnn; ooo=ppp; } 
catch(err){ alert(err.message); }

显然,alert()不应该在生产版本中使用,但在调试版本中非常有用。 它应该能够在旧浏览器(如IE 6)中正常工作:

https://msdn.microsoft.com/library/4yahc5d8%28v=vs.94%29.aspx


-1
如果a未定义,则
a == undefined

会真正抛出一个错误。使用

(typeof a) === "undefined"

相反。


1
哎呀,你说得对,我漏掉了 OP 代码开头的 "var a"。 - Chris Garaffa

-2
如果您声明var a,那么它将不再是未定义的 - 它将变成null。我通常使用typeof a == undefined,这非常有效。尤其是在这种情况下,这特别有用:
function myfunc(myvar)
{
    if(typeof myvar == "undefined")
    {
        //the function was called without an argument, simply as myfunc()
    }
}

typeof 返回一个字符串。 - Shef
那个 if 语句会返回 FALSE -- typeof 函数返回一个字符串值。 - Naftali
嗯,我今天在一个生产系统中刚使用过它 - 它完美运行。 - Aleks G
3
那是因为你没有使用 === 来确定相等性。 - Naftali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接