gpt4 book ai didi

JavaScript:检查变量或对象是否存在

转载 作者:行者123 更新时间:2023-11-30 08:05:26 24 4
gpt4 key购买 nike

如果设置或未设置变量/对象,我有一个函数返回:

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,但它不起作用。我哪里错了?


编辑:

所以下面的答案是正确的。正如我所预料的那样,您无法访问 undefined variable 或使用 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()"); }
}

最佳答案

你不能用函数做那种类型的检查。为了传递变量,它需要存在,所以它会在您的代码运行之前失败。

当您在未声明的变量上调用它时,您正在尝试解析参数位置中标识符的值。

//     v----resolve identifier so it can be passed, but resolution fails
isset(foo);

当然,它不存在,所以会抛出 ReferenceError

JavaScript 没有指针,所以没有像 nil 指针这样的东西可以代替它传递。

关于JavaScript:检查变量或对象是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18901800/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com