如果设置了变量/对象,我有一个返回的函数:
function isset() {
var a = arguments, l = a.length;
if (l === 0) { console.log("Error: isset() is empty"); }
for (var i=0; i<l; i++) {
try {
if (typeof a[i] === "object") {
var j=0;
for (var obj in a[i]) { j++; }
if (j>0) { return true; }
else { return false; }
}
else if (a[i] === undefined || a[i] === null) { return false; }
}
catch(e) {
if (e.name === "ReferenceError") { return false; }
}
}
return true;
}
例如,这有效:
var foo;
isset(foo); // Returns false
foo = "bar";
isset(foo); // Returns true
foo = {};
isset(foo); // Returns false
isset(foo.bar); // Returns false
foo = { bar: "test" };
isset(foo); // Returns true
isset(foo.bar); // Returns true
问题是......如果永远不会将foo设置为开头,则会发生这种情况:
// foo has not been defined yet
isset(foo); // Returns "ReferenceError: foo is not defined"
我认为如果error.name ===“ReferenceError”,我可以使用try / catch / finally返回false,但它不起作用。我哪里错了?
所以下面的答案是正确的。正如我所料,您无法访问未定义的变量或使用try / catch / finally捕获它(请参阅下面的解释)。
然而,这是一个不那么优雅的解决方案。您必须在引号中传递变量的名称,然后使用eval进行检查。这很难看,但它确实有效:
// Usage: isset("foo"); // Returns true or false
function isset(a) {
if (a) {
if (eval("!!window."+a)) {
if (eval("typeof "+a+" === 'object'")) { return eval("Object.keys("+a+").length > 0") ? true : false; }
return (eval(a+" === undefined") || eval(a+" === null") || eval(a+" === ''")) ? false : true;
}
else { return false; }
}
else { console.log("Empty value: isset()"); }
}
为了跟进更多,我在最顶层清理了原来的功能。它仍然有同样的问题,如果变量不存在,你得到一个ReferenceError,但这个版本更清洁:
// Usage: isset(foo); // Returns true or false if the variable exists.
function isset(a) {
if (a) {
if (typeof a === "object") { return Object.keys(a).length > 0 ? true : false; }
return (a === undefined || a === null || a === "") ? false : true;
}
else { console.log("Empty value: isset()"); }
}
答案 0 :(得分:3)
您无法使用某项功能进行此类检查。为了传递变量,它需要存在,因此在代码运行之前它将失败。
当你在未声明的变量上调用它时,你试图在参数位置解析标识符的值。
// v----resolve identifier so it can be passed, but resolution fails
isset(foo);
当然,它不存在,因此抛出 ReferenceError 。
JavaScript没有指针,因此没有像nil
指针那样可以在其位置传递。
答案 1 :(得分:3)
您无法传递尚未初始化的标识符。您可以传递一个字符串和一个要测试的对象,如下所示:
function isset(str, obj) {
return obj[str] ? true : false;
}
isset("foo", window); // >>> false