【问题标题】:ES6 access object attribute without error even if object is null/undefined [duplicate]即使对象为空/未定义,ES6 访问对象属性也不会出错 [重复]
【发布时间】:2018-03-26 19:24:48
【问题描述】:

在 ruby​​ 中,有一个漂亮的方法叫做 .try,它允许访问对象属性/方法而不会有出错的风险。

例如。

{hello: 'world'}.try(:[], :hello) # 'world'
nil.try(:[], :hello) # nil (no error)

有没有办法在 ES6 中优雅地实现这种语法?

现在,我一直在写丑:

if (object && object.key && object.key.subkey) {
  return object.key.subkey
}

谢谢

【问题讨论】:

    标签: javascript ecmascript-6


    【解决方案1】:

    我使用 lodash _.get:

    https://lodash.com/docs/4.17.5#get

    例如

    _.get(object, 'property', null);
    

    非常方便.. 如果对象不存在,它会退回到默认传递,例如空。

    非常适合深度嵌套的对象。

    例如

    _.get(object, 'a.b.c.d', 'default');
    

    还有一些来自 lodash 文档的示例:

    var object = { 'a': [{ 'b': { 'c': 3 } }] };
    
    _.get(object, 'a[0].b.c');
    // => 3
    
    _.get(object, ['a', '0', 'b', 'c']);
    // => 3
    
    _.get(object, 'a.b.c', 'default');
    // => 'default'
    

    【讨论】:

    • 是的!应该有这个的本机实现。另外,我不是字符串路径描述 (a.b.c.d) 的忠实粉丝。例如,如果有另一个像 object~key~subkey 这样的操作数会更好。
    • 是的,我觉得这个很棒,应该原生实现。自 ES6 以来,我发现自己使用的 lodash 越来越少,因为我们现在拥有所有好东西,例如 map filter reduce 等。但是 _.get 和 _.has 函数在遍历对象树时非常有用。
    【解决方案2】:

    Try 确实存在于 ES6 中,但它有点不同。它需要一个 catch,但是,我们可以让 catch 什么都不做,不建议这样做。

    const obj = {hello: 'world'};
    
    //passes so does the console log
    try{console.log(obj.hello)} catch(e){}
    //fails so does nothing
    try{console.log(nil.hello)} catch(e){}

    【讨论】:

      猜你喜欢
      • 2014-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 2019-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多