Javascript函数封装检查变量是否未定义?

时间:2011-07-09 02:23:32

标签: javascript

我一直在研究javascript库,我有很多冗余的检查:

if(typeof foo !== "undefined" && foo !== null)

所以,我想创建一个函数,它将成为这个笨重的检查的快捷方式。所以我想出了这个:

function isset(a) 
{
     return (typeof a !== "undefined" && a !== null) ? true : false;
}

但是,由于该值可能未定义,并且它尝试使用可能未定义的变量,因此结果是无用的。

有没有办法在不扩展本机原型的情况下实现这一目标?

4 个答案:

答案 0 :(得分:3)

这实际上取决于undefined的含义。

<强> 1。你的意思是变量不存在。

在这种情况下,你想要的是不可能的。 typeof是一个操作符,因此具有您无法使用该语言模拟的魔术行为。如果您尝试将不存在的变量传递给您的函数,它将抛出ReferenceError

(请参阅下面的解决方法。)

<强> 2。您的意思是变量的值为undefined,但确实存在

在这种情况下,你的功能可以解决问题 - 虽然它可以简化为以下内容:

function isset(variable) {
    return variable != null;
}

如果变量为falseundefined,此函数将返回null。它利用了JavaScript中的undefined == null这一事实。当然,有这么短的功能,人们可能会认为根本不需要这个功能。

回想一下,声明的变量默认值为undefined


你的功能名称暗示你的意思是#1。我不知道你正在写什么类型的库,但是我无法想象你需要检查变量是否存在的库中的一个案例,尽管我可以想到很多可能性案例#2。

如果需要使用第1种情况,请记住您可以在不更改其值的情况下重新声明变量:

a = 1; // pretend this was set somewhere higher up in the code
var a; // this does not change the value of `a`

如果在使用isset之前重新声明变量,则可以避免ReferenceError问题。但是,您无法判断代码是否已经声明了变量;你只能告诉他们是否没有将它分配给其他值。

答案 1 :(得分:2)

您可以使用null同时检查undefined!=

    // checks for both null and undefined
if( foo != null ) { ...

...所以不需要使用函数来缩短它。

答案 2 :(得分:0)

nullundefined也会在false语句中评估为if。所以以下陈述也有效:

if(!foo)
    ...

这应该会显着降低它。

答案 3 :(得分:0)

我不明白为什么人们会继续宣传if (var)if (!var)。两者都在我的浏览器中失败同时if (obj.prop)通过。这意味着我们应该使用if (this.someVar)if (window.someVar)代替if (varbl)。好?