我一直在研究javascript库,我有很多冗余的检查:
if(typeof foo !== "undefined" && foo !== null)
所以,我想创建一个函数,它将成为这个笨重的检查的快捷方式。所以我想出了这个:
function isset(a)
{
return (typeof a !== "undefined" && a !== null) ? true : false;
}
但是,由于该值可能未定义,并且它尝试使用可能未定义的变量,因此结果是无用的。
有没有办法在不扩展本机原型的情况下实现这一目标?
答案 0 :(得分:3)
这实际上取决于undefined
的含义。
<强> 1。你的意思是变量不存在。
在这种情况下,你想要的是不可能的。 typeof
是一个操作符,因此具有您无法使用该语言模拟的魔术行为。如果您尝试将不存在的变量传递给您的函数,它将抛出ReferenceError
。
(请参阅下面的解决方法。)
<强> 2。您的意思是变量的值为undefined
,但确实存在。
在这种情况下,你的功能可以解决问题 - 虽然它可以简化为以下内容:
function isset(variable) {
return variable != null;
}
如果变量为false
或undefined
,此函数将返回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)
null
和undefined
也会在false
语句中评估为if
。所以以下陈述也有效:
if(!foo)
...
这应该会显着降低它。
答案 3 :(得分:0)
我不明白为什么人们会继续宣传if (var)
或if (!var)
。两者都在我的浏览器中失败同时if (obj.prop)
通过。这意味着我们应该使用if (this.someVar)
或if (window.someVar)
代替if (varbl)
。好?