如果我需要检查一个对象的属性及其对象(等等)但是不能确定该对象是否存在,那么我怎样才能使该条件比此?
if (a !== undefined && a.b !== undefined && a.b.c === 'foo')
如果它有任何有意义的功能,我也会使用 LoDash 。
答案 0 :(得分:4)
Lodash有_.get
,它允许您定义对象中嵌套项的键路径。它会为您处理中间检查,如果找不到密钥则只返回composer dump-autoload
或默认值。
undefined
答案 1 :(得分:4)
如果你知道a
在当前范围内(比如作为参数加入),你可以这样做
if(a && a.b && a.b.c === 'foo')
但如果永远无法定义a
,您必须检查类型如下:
if( typeof a != 'undefined' && a.b && a.b.c === 'foo')
<强>更新强>
当使用lodah时,has
函数可以提供更好的语法(与get
函数不同,如果属性是伪值,则返回true。感谢@ryeballar):
if(lodash.has(a,'b.c')){
console.log(a.b.c);
}
答案 2 :(得分:2)
如果a
确实不存在,那么您将需要 try / catch ,这意味着您可以这样做:
try {
if (a.b.c === 'foo') {
// Do stuff.
}
} catch (ignore) {}
答案 3 :(得分:1)
在您担心缩短代码之前,您需要知道在a
不存在时您的代码会出错:
if (a !== undefined && a.b !== undefined && a.b.c === 'foo'){
console.log("a exists, a.b exists and a.b.c === 'foo'");
}
如果没有收到错误,您将无法访问不存在的对象。因此,您需要检查a
的类型以查看它是否为"undefined"
(注意,要检查的值是字符串)。
function checkObj(){
if (typeof a !== "undefined" && a.b && a.b.c === 'foo'){
console.log("a exists, a has a b property and a.b.c === 'foo'");
} else {
console.log("Not all conditions met.");
}
}
checkObj(); // a doesn't exist --> "Not all conditions met."
var a = {};
checkObj(); // a exists, but b and c don't --> "Not all conditions met."
a.b = {};
checkObj(); // a and b exist but c doesn't --> "Not all conditions met."
a.b.c = "test";
checkObj(); // a, b and c exist, but c has wrong value --> "Not all conditions met."
a.b.c = "foo";
checkObj(); // "a exists, a has a b property and a.b.c === 'foo'"