一个老问题,现在我们经常有 Typescript 项目,以至于这个问题似乎无关紧要,但我来这里是为了寻找同样的东西,所以我做了一个简单的函数来做。你关于不使用 try/catch 的想法对我来说太严格了,毕竟 seek forundefined.x
无论如何都会导致错误。因此,这就是我的方法。
function getSafe (obj, valuePath) {
try { return eval("obj." + valuePath); }
catch (err) { return null; }
}
要使用它,我们必须传递对象。我试图避免这种情况,但没有其他方法可以从另一个函数中获取范围(这里有很多关于这个的问题)。还有一个小测试集来看看我们得到了什么:
let outsideObject = {
html: {
pageOne: {
pageTitle: 'Lorem Ipsum!'
}
}
};
function testme() {
let insideObject = { a: { b: 22 } };
return {
b: getSafe(insideObject, "a.b"), // gives: 22
e: getSafe(insideObject, "a.b.c.d.e"), // gives: null
pageTitle: getSafe(outsideObject, "html.pageOne.pageTitle"), // gives: Lorem Ipsum!
notThere: getSafe(outsideObject, "html.pageOne.pageTitle.style") // gives: undefined
}
}
testme();
更新:关于使用,eval
我认为 eval 是一个谨慎使用的工具,而不是魔鬼本身。在这种方法中,用户不会干扰 eval,因为开发人员正在通过名称查找属性。