JavaScript:检查变量或对象是否存在
JavaScript: Check to see if a variable or object exists
我有一个函数来返回是否设置了变量/对象:
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,我可以使用 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()"); }
}
你不能用函数做这种类型的检查。为了传递变量,它需要存在,因此它将在代码运行之前失败。
在未声明的变量上调用它时,您正在尝试解析参数位置中的标识符值。
// v----resolve identifier so it can be passed, but resolution fails
isset(foo);
当然,它不存在,所以抛出了 ReferenceError。
JavaScript 没有指针,所以没有什么比 nil
指针更能代替它传递的了。
不能传递尚未初始化的标识符。您可以传递一个字符串和一个要测试的对象,如下所示:
function isset(str, obj) {
return obj[str] ? true : false;
}
isset("foo", window); // >>> false
相关文章:
- 如何检查数组中的对象是否等于选项值
- 测试对象是否相等和/或对象是否有更多的关键点,但仍然与共同的关键点相等
- 确定javascript中的html表对象是否具有<colgroup>是否
- 验证对象是否为null Javascript/Angularjs
- 如何通过json对象选项卡中的Id来检查对象是否存在
- jQuery-检测选择对象是否添加或删除了选项
- 检查对象是否是mongo游标
- Three.js-如何检查对象是否在球体后面(不可见)
- 检查对象是否基于jquery对象
- 在JSON项上循环,无论JSON对象是否具有多个数组
- 递归Javascript对象是否会导致任何问题(内存泄漏)
- Javascript如何确定两个对象是否相同
- 如何检查文字对象是否在 Javascript 数组中
- 检查对象是否已被推入数组 Js
- 变量/对象是否按值传递,为什么我不能在 javascript 中使用变量更改对象的属性
- JavaScript 如何检查包含数组的对象是否为空
- 嵌套对象是否被视为良好做法
- 在node.js/ssocket.io中,如何判断对象是否是套接字的实例
- 是否有跨浏览器和跨框架的方法来检查对象是否是HTML元素
- 有没有办法检查一个对象是否存在并且在一行中有一个子对象