检查 javascript 中是否存在子节点的最佳方法是什么?

What is the best way to check if a child's node exists in javascript?

我很想知道检查子节点是否存在的最佳实践方法是什么。

var object = {}

假设我想访问:object.child.element 它会 return:

Uncaught TypeError: Cannot read property 'element' of undefined

因为 child 未定义。

我可以先检查每个节点是否已定义:

if (object.child) {
    object.child.element 
}

所以这将避免 TypeError 因为 object.child 应该是 undefined 但是如果我们说 5 个元素,那么拥有所有这些 if 语句将不是一个可行的解决方案。

所以我倾向于做的是将地段包裹在 try.

try {
    var test = object.child.element.foo.bar;
} catch (error) {
    console.log(error);
}

所以 test 只有在子节点、元素节点和 foo 节点存在的情况下才会存在。

还有比这更好的模式吗?

在可读性方面绝对不是最佳实践,但我经常使用以下结构(不仅用于节点,而且通常):

if (object.child && object.child.element)

在此处查看:

var a = {};
var b = {"child": {}};
var c = {"child": {"element": "finally"}};
         
console.log(a.child && a.child.element);
console.log(b.child && b.child.element);
console.log(c.child && c.child.element);

嵌套越多,代码就会变得越来越糟糕,所以你最终可能会得到一些丑陋的东西:

object && object.child && object.child.element && object.child.element.another...

不过,好处是它也可以很好地处理作业:

var obj = {"child": 123};
var other = obj && obj.child; // 123

如果您知道属性名称为字符串,则可以递归检查是否存在。

var properties = ["child", "element", "foo", "bar"];
var i = 0;
var test = obj;
while(i < properties.length && !!test[properties[i]]) {
   test = test[properties[i++]];
}
if(i === properties.length) console.log("success", test);