【问题标题】:Javascript undefined object properties [duplicate]Javascript未定义的对象属性[重复]
【发布时间】:2018-04-08 03:02:12
【问题描述】:

我想知道在以下情况下如何检查未定义的属性?

let foo = {
    bar: {
        f: {
            b: 90
        }
    }
}

我觉得有点

foo.bar && foo.bar.f && foo.bar.f.b ? foo.bar.f.b : null

也许可行,但我相信存在更好的方式。

【问题讨论】:

  • 所以如果我理解正确,您的解决方案可能有效,但您不确定,您正在寻找更好的方法。对吗?
  • 它被标记为重复,但万一有人到达这里,我会在这种情况下使用:((foo.bar||{}).f||{}).b||null
  • @Piyin 处理太多了。简单的方法可以是try { return foo.bar.f.b } catch(ex) { return null }。这使代码简单易读
  • @Rajesh 起初我认为你是对的,但我做了一个性能测试,看起来try...catch 只有在嵌套超过九层后才能获胜:jsfiddle.net/0o3ag3t6/1 我可能是错的,尽管。所以如果你发现任何缺陷,请告诉我
  • @Piyin 请使用 jsperf 检查性能。使用 1 或 2 个案例不会给您带来实际的结果。我在手机上,所以我会在一两天内分享一个链接

标签: javascript typescript


【解决方案1】:

您可以使用名为lodash 的模块。它实际上是惊人的,并简化了很多工作。例如,在这种情况下,您将使用 _.get(foo, 'bar.f.b', 'default');

如果属性存在则返回,否则返回'default'。您可以将第三个参数更改为您喜欢的任何参数,例如 null

【讨论】:

  • 很好的提示。但是,我相信运行 loadash 必须是内部昂贵的代码。
  • 您应该询问 OP 是否可以使用库。
  • @iquellis lodash 有一个标准的性能基准和使用库的好处,你是否解决了浏览器兼容性问题
  • @iquellis ,根据我个人的开发经验,这是多年以来的 JS,除非您正在处理某种图形引擎或数百万数据(您应该避免和隔离),否则它赢了不贵。如今,浏览器和 CPU 的速度已经足够快,不必为此烦恼。
  • @Ted 这可能是真的,但考虑到没有库被标记并且两个 OP 对库的解决方案都没有共同兴趣这一事实,它可能会吸引不需要的 cmets/投票。尽管如此,我的评论是一个建议。希望能帮助到你。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 2018-08-01
相关资源
最近更新 更多