探索 JavaScript 的新特性:可选链(Optional Chaining)

83 阅读3分钟

探索 JavaScript 的新特性:可选链(Optional Chaining)

在 JavaScript 的世界中,我们经常需要处理来自各种来源的数据,这些数据可能并不总是我们期望的完整和可靠。特别是在处理嵌套对象时,如果某个属性或子对象不存在,传统的访问方式可能会导致运行时错误。为了解决这个问题,ES2020 引入了一个激动人心的新特性:可选链(Optional Chaining)。

什么是可选链?

可选链允许你读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。如果链中的某个属性不存在,表达式将短路并返回 undefined,而不是抛出错误。这种特性在处理来自用户输入、外部 API 或其他不可预测来源的数据时特别有用。

如何使用可选链?

可选链使用 ?. 运算符来表示。下面是一个简单的示例:

const user = {
  name: 'Alice',
  address: {
    city: 'New York',
    zip: '10001'
  }
};

// 使用可选链来安全地访问 zip 属性
const zipCode = user?.address?.zip; // 返回 "10001"

// 如果 user 或 address 不存在,zipCode 将是 undefined
const userWithNoAddress = {
  name: 'Bob'
};
const zipCode2 = userWithNoAddress?.address?.zip; // 返回 undefined

有趣的应用场景

探险家的背包

让我们以一个有趣的探险家背包的场景为例。探险家可能有一个背包,背包里有各种装备。但是,不是所有的探险家都带有背包,也不是所有的背包都包含所有装备。

const explorer = {
  name: 'Indiana Jones',
  backpack: {
    equipment: {
      map: 'Ancient Map',
      compass: 'Gold Compass'
    },
    food: 'Sandwiches'
  }
};

const explorerWithNoBackpack = {
  name: 'Lara Croft',
  weapon: 'Dual Pistols'
};

// 使用可选链来列出探险家的装备
function listEquipment(explorer) {
  const equipment = `探险家 ${explorer.name} 的装备有:${
    explorer?.backpack?.equipment?.map ?? '无地图'
  }, ${
    explorer?.backpack?.equipment?.compass ?? '无指南针'
  }, ${
    explorer?.backpack?.food ?? '无食物'
  }`;
  console.log(equipment);
}

listEquipment(explorer); // 输出探险家 Indiana Jones 的装备
listEquipment(explorerWithNoBackpack); // 输出探险家 Lara Croft 的装备(无背包和装备)

安全的函数调用

可选链也可以用于函数调用,确保在调用函数之前,其所属的对象存在。

function getUser() {
  // ... 逻辑处理,可能返回 null 或用户对象
}

const user = getUser();
user?.someFunction?.(); // 如果 user 或 someFunction 不存在,则不会执行并返回 undefined

为什么要使用可选链?

  • 减少错误:通过使用可选链,你可以避免由于尝试访问不存在的属性而导致的运行时错误。
  • 代码更简洁:可选链允许你在一行代码中安全地访问嵌套属性,而无需使用冗长的条件语句或额外的变量来检查每个属性是否存在。
  • 提高可读性?. 运算符直观且易于理解,使得代码更具可读性。

结论

可选链是 JavaScript 中的一个强大特性,它允许你更安全、更简洁地处理嵌套对象和函数调用。通过避免潜在的运行时错误,你可以更自信地处理来自不可预测来源的数据,并编写更健壮的代码。如果你还没有在你的项目中尝试使用可选链,那么现在是时候开始了!