【发布时间】:2011-08-18 06:28:55
【问题描述】:
我不是在问变量是未定义还是null。我想检查变量是否存在。这可能吗?
【问题讨论】:
-
这只是我的看法,但对于任何基于检查变量或函数是否存在的逻辑来说,这似乎都是一种糟糕的方法。如果你的逻辑需要一些变量,我真的认为这是一个语义或语法错误,而不是一个逻辑决定。
标签: javascript
我不是在问变量是未定义还是null。我想检查变量是否存在。这可能吗?
【问题讨论】:
标签: javascript
if ('bob' in window) console.log(bob);
记住这种方式,即使你用var声明了一个变量,也意味着它存在。
【讨论】:
window.bob = false 是一个反例。
当您尝试访问未在上下文中声明的变量时,您会看到错误消息说它未定义。这是您可以执行的真正检查,以查看变量是否已定义,而不是 null 检查。
【讨论】:
typeof 技术不起作用,因为它们无法区分根本未声明变量和已声明变量但未分配值或声明并设置为 undefined。
但是,如果您尝试使用尚未在 if 条件(或赋值右侧)中声明的变量,则会出现错误。所以这应该有效:
var exists = true;
try {
if (someVar)
exists = true;
} catch(e) { exists = false; }
if (exists)
// do something - exists only == true if someVar has been declared somewhere.
【讨论】:
var exists = false; try { eval("someVar"); exists = true } catch (e) { }; if (exists) ... -- eval() 是为了防止一个超级智能的 Javascript 引擎优化它。它还会欺骗大多数其他静态分析。
try 块内有一个额外的 exists = true; 既多余又令人困惑,因为它并不是逻辑的一部分:if (someVar) {}鉴于 if() 的意义在于尝试崩溃而不是在可行的情况下不做某事,所以应该已经完成了这个技巧。分配可能是比 if 或如您所说的 eval 更好的选择。
var exists = true; try {someVar} catch(e) {exists = false;}一样简单。
如果您不需要在运行时知道,请使用 JSLint。还要记住,javascript var 语句被提升,所以即使 var 在 if 块内,它仍然会被定义。
老实说,我认为如果您不确定是否定义了变量,那么您做错了什么,应该重构您的代码。
【讨论】:
试试这个
var ex=false;
try {(ex=myvar)||(ex=true)}catch(e) {}
alert(ex);
如果myvar 已声明,则ex 为真。
【讨论】:
我认为这取决于你想对变量做什么。
假设,例如,您有一个 JS 库,如果它已定义,它将调用一个函数,如果没有,则不。您可能已经知道,函数是 JS 中的第一级对象,也是变量。
您可能会想先询问它是否存在,然后再调用它。但是您也可以将调用它的尝试包装在 try/catch 块中。
在触发事件之前和之后调用函数(如果已定义)的代码示例:
function fireEvent(event)
{
try
{
willFireEvent(event); // Is maybe NOT defined!
} catch(e) {}
//... perform handler lookup and event handling
try
{
hasFiredEvent(event); // Might also NOT exist!
} catch(e) {}
}
因此,与其检查变量,不如捕获错误:
var x;
try
{
x = mayBeUndefinedVar;
}
catch (e)
{
x = 0;
}
这在性能等方面是否是好事,取决于你在做什么......
【讨论】:
我使用这个功能:
function exists(varname){
try {
var x = eval(varname);
return true;
} catch(e) { return false; }
}
希望这会有所帮助。
【讨论】:
你追求的是:
window.hasOwnProperty("varname");
更安全的方法甚至可能是:
this.hasOwnProperty("varname");
不过取决于您的调用上下文...
【讨论】:
window 或this 的属性。