2023年你还在用if、try catch、&&来访问深层次对象的属性么?

69 阅读2分钟

JavaScript深层次对象属性获取可能为undefined的问题处理方法

以下是几种常见的处理方式:

  1. 使用逻辑运算符(&&):

    const value = obj && obj.prop1 && obj.prop1.prop2 && obj.prop1.prop2.prop3;
    

    这种方式使用逻辑与运算符(&&)来检查每个属性是否存在。只有在所有属性都存在时,才会获取最终的属性值。如果任何一个属性不存在,表达式将返回undefined。

  2. 使用try-catch块:

    let value;
    try {
      value = obj.prop1.prop2.prop3;
    } catch (error) {
      value = undefined;
    }
    

    这种方式使用try-catch块来捕获可能出现的错误。如果属性链中的任何一个属性不存在,将抛出错误,然后在catch块中将值设为undefined。

  3. 使用Lodash库(或类似的工具库):

    const value = _.get(obj, 'prop1.prop2.prop3');
    

    如果你使用Lodash等工具库,可以使用其提供的get函数来安全地获取深层次的属性值。该函数接受对象和属性路径作为参数,并在属性不存在时返回undefined,而不会引发错误。

    这些方法中的每一种都有其适用的场景。如果你只需要处理几个深层次的属性获取,使用逻辑运算符(&&)通常是最简单的方法。如果你需要处理多个深层次属性的获取,使用Lodash等工具库可以更方便地处理。使用try-catch块通常用于处理异常情况,比如在动态环境中不确定属性是否存在的情况。

    选择适合你需求的方法,并根据具体情况决定如何处理可能为undefined的属性获取问题。

  4. 使用可选链式操作符(?.)和空值合并运算符(??):

    const value = obj?.prop1?.prop2?.prop3 ?? undefined;
    

    JavaScript ES2020 引入了可选链式操作符(?.)。这个运算符在试图访问深度嵌套的对象链中的属性时,如果链条中的任何部分未定义,不会导致错误,而是返回 undefined。然后,你可以使用空值合并运算符(??)来为可能的 undefined 提供一个默认值。在这个例子中,如果 obj.prop1.prop2.prop3 不存在,value 将会是 undefined

注意:使用可选链式操作符(?.)和空值合并运算符(??)需要你的 JavaScript 环境支持 ES2020 或更高版本。