很长一段时间以来,我发现自己检查每个嵌套对象是否存在。
例如 如果我需要的话
someObject.innerThing.evenInnerer.superInerer.length
我必须做
let length = someObject && someObject.innerThing && someObject.innerThing.evenInnerer && someObject.innerThing.evenInnerer.superInerer && someObject.innerThing.evenInnerer.superInerer.length;
防止异常。
所以我想了一种让它更简单的方法,并使用外部方法(在类内......),就像这样 -
const dataFetcher = (appName, failedFunc) => {
try {
let item = eval(appName);
return item;
} catch (e) {
failedFunc && failedFunc();
return undefined;
}
};
然后执行此操作=>
let length = dataFetcher("someObject.innerThing.evenInnerer.superInerer.length", optionalErrorFunc);
if(length == undefined)....
而且它更干净、更简单(IMO)。
这有什么缺点吗?
谢谢
最佳答案
即使您确定它 100% 安全,当还有其他同样简单的选项时,通常最好避免使用 eval()
。使用 try-catch
来完成此操作会使事情变得更糟,并且您的实现假设从 dataFetcher
的 Angular 来看,传入名称的变量在范围内> 功能,这使得它难以使用且不可移植。
在最新版本的 JavaScript 中,您可以使用条件链:
const length = someObject?.innerThing?.evenInnerer?.superInnerer?.length;
还有一些 JS 帮助程序库提供了类似这样的帮助功能。
例如Ramda中的path
函数:
const length = path(['innerThing', 'evenInnerer', 'superInnerer', 'length'], someObject);
如果该路径上的任何内容不存在,这将产生一个未定义
值。
如果您不想为此涉及第三方库,则编写自己的 path
函数非常简单:
const path = (steps, obj) =>
steps.reduce(
(acc, next) => next in acc ? acc[next] : undefined,
obj
);
console.log(path(['a', 'b', 'c'], { a: { b: { c: 5 } } })); // 5
console.log(path(['a', 'b', 'c'], { a: { b: { f: 5 } } })); // undefined
关于javascript - React - 使用 eval() 确定 var 是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65717513/