通常,如果我要检查是否obj.foo.bar
退出,我将执行以下操作:
if(
typeof obj != "undefined" &&
typeof obj.foo !== "undefined" &&
typeof obj.foo.bar !== "undefined"
){ action() }
这是非常丑陋且重复的,可悲的是我不得不经常使用它。
我相信将没有可用的函数isDefined()
,因为即使是空函数(function isDefined(){}
)也会在if(isDefined(obj.foo.bar)){action()}
那么,有什么聪明的方法来检查obj.foo.bar
退出吗?
编辑:
typeof obj != "undefined"
可以用代替obj
。这个解决方案仍然不能令我满意。编辑2-解决方案:
如这里所建议
var a = {
b: {
c: 'd'
}
};
function isDefined(fn) {
var value;
try {
value = fn();
} catch (e) {
value = undefined;
} finally {
return value !== undefined;
}
};
// ES5
console.log(
isDefined(function () { return a.b.c; }), //return true
isDefined(function () { return a.b.c.d.e.f; }) //returns false
);
// ES6 using the arrow function
console.log(
isset(() => a.b.c),
isset(() => a.b.c.d.e.f)
);
我批准了@TJ Crowder的解决方案,而不是@somethinghere的解决方案,因为最后常规解决方案更短了,并且try
catch
语句有其他目的并且可能导致问题
您可以减少很多丑陋的事情,因为您不需要typeof
大多数:
if (obj && obj.foo && typeof obj.foo.bar !== "undefined") {
action();
}
如果 obj.foo.bar
不能成为falsey值(0
,""
,NaN
,null
,undefined
,或false
),你不需要做typeof
的最后一个项目,之一:
if (obj && obj.foo && obj.foo.bar) {
action();
}
如果您确实想要一个isDefined
函数,则必须按照另一个问题及其答案中的概述进行字符串解析,但是如果您使用一个重命名(缩短)属性名称并且包含字符串解析功能的压缩程序,则可能会遇到问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句