我不是在询问变量是否未定义或为null
。我想检查变量是否存在。这是否可能?
我不是在询问变量是否未定义或为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 引擎将其优化掉。它也会欺骗大多数其他静态分析工具。 - user166390exists = true;
是多余和令人困惑的,因为它实际上不是逻辑的一部分:if (someVar) {}
应该足够了,因为if()的目的只是尝试崩溃而不是在它工作时做某事。赋值可能比if更好的选择,或者像你说的那样,使用eval。 - nnnnnnvar exists = true; try {someVar} catch(e) {exists = false;}
。 - RobG
function exists(varname){
try {
var x = eval(varname);
return true;
} catch(e) { return false; }
}
if ('bob' in window) console.log(bob);
var
声明了一个变量,也意味着它存在。window.bob = false
是一个反例。 - user166390window.hasOwnProperty("varname");
更安全的方法甚至可能是:
this.hasOwnProperty("varname");
不过这取决于你的调用上下文...
window
或 this
的属性。 - nnnnnn我认为这取决于您想如何使用变量。
例如,假设您有一个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;
}
试一下这个
var ex=false;
try {(ex=myvar)||(ex=true)}catch(e) {}
alert(ex);
其中ex
为真,如果myvar
已经声明。