【问题标题】:Checking for existence of function nested deeply in object which may not exist? [duplicate]检查是否存在嵌套在可能不存在的对象中的函数? [复制]
【发布时间】:2015-12-03 13:29:31
【问题描述】:

如果存在,我想调用给定的函数。我写过:

var backgroundPage = window.chrome && chrome.extension &&
 chrome.extension.getBackgroundPage ? chrome.extension.getBackgroundPage() : null;

我想知道是否有更好的方法来短路所有这些检查,并且只在存在时调用 chrome.extension.getBackgroundPage

如果我这样做了

typeof chrome.extension.getBackgroundPage === 'function'

如果 chromechrome.extension 未定义,我仍然会遇到错误。

在许多情况下,我都可以使用https://lodash.com/docs#get 等实用函数:

var getBackgroundPage = _.get(window, 'chrome.extension.getBackgroundPage');

但对于我的特定场景,我无法使用实用程序库,因为完整代码用作 lodash 的加载器。

【问题讨论】:

  • 查看此处获取嵌套路径stackoverflow.com/questions/6491463/…。然后检查它是否是一个函数,如果是则执行它。
  • 没有更多的......原生?不幸的是(具有讽刺意味的是?),此代码用作 lodash 的加载器,因此我无法在这种情况下使用实用程序库。否则,lodash.com/docs#get
  • 你不需要图书馆,get=(p,o)=>p.reduce((a,k)=>a&&a[k],o); get(['a','b','c'],{a:{b:{c:1}}}) // 1
  • 您也可以从 lodash 中提取该方法并放入您自己的代码中...

标签: javascript


【解决方案1】:

这就是try...catch声明的目的:

try {
  object.p1.p2.p3;
}
catch (e) {
  if (e.name === 'ReferenceError') {
    // pass
  }
}

【讨论】:

  • 不过,这不是一个例外情况。应使用 try/catch 语句来帮助从未预料到的意外情况中恢复。 stackoverflow.com/a/2631168/633438
  • @SeanAnderson 有问题。这是一个例外情况(很明显),这是这个例外的唯一目的。
猜你喜欢
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2018-12-23
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多