javascript - React - 使用 eval() 确定 var 是否存在

标签 javascript reactjs

很长一段时间以来,我发现自己检查每个嵌套对象是否存在。

例如 如果我需要的话

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/

相关文章:

javascript - ng重复: dupes ERROR on simple JSON

javascript - 如何在 AmCharts 的值轴中设置连续整数步长?

javascript - Sencha Touch、MessageBox 更改默认值

reactjs - Mern heroku 当我重新加载页面时出现内部服务器错误

reactjs - CLI 移至单独的包中 : webpack-cli. 我的程序出了什么问题?

javascript - 分隔数组内的元素

javascript - CSS对齐以适应不同的屏幕分辨率

javascript - AngularJS Controller 无法将 Youtube API 响应结果存储到变量

reactjs - golang模板中不想使用 '{{ }}'怎么办?

reactjs - 带有反应钩子(Hook)的成员函数