详解 ECMAScript 2021 中的可选链 (?.) 操作符

在前端开发中,我们经常需要用到 JavaScipt 操作浏览器的 DOM 元素或数据等,但是当 DOM 元素或数据不存在时,JS 代码会出现错误,导致程序终止执行。为了解决这个问题,ECMAScript 2021 中推出了可选链操作符 (?.),该操作符可以在安全的情况下访问对象的属性或方法,避免了出现 TypeError 错误。本文将详细介绍可选链操作符的使用方法和示例代码。

可选链操作符 (?.) 的基本语法

可选链操作符使用问号(?)和点号(.)分割开来,语法格式如下:

object?.property
object?.method()
object?.[property]

其中,object 是需要访问的对象;property 是需要访问的属性;method 是需要访问的方法。

该语法表示通过对象访问属性或调用方法时,如果对象或属性或方法不存在,则不会出现错误,直接返回 undefined

可选链操作符示例代码

  1. 访问对象属性
const user = {
  name: '张三',
  age: 18,
  favorite: {
    sport: '足球',
    food: '巧克力'
  }
};
// user 对象中有 favorite 属性,可以正常输出
console.log(user.favorite.sport); // "足球"
// user 对象中没有 hobby 属性,会出现 TypeError 错误
console.log(user.hobby.color); // TypeError: Cannot read property 'color' of undefined

// 使用可选链操作符 (?.),当 hobby 属性不存在时,不会出现错误,直接返回 undefined
console.log(user.hobby?.color); // undefined
  1. 调用对象方法
const user = {
  name: '张三',
  age: 18,
  sayHi() {
    console.log(`大家好,我叫 ${this.name},我今年 ${this.age} 岁。`);
  }
};
// user 对象中有 sayHi 方法,可以正常输出
user.sayHi(); // "大家好,我叫 张三,我今年 18 岁。"
// user 对象中没有 eat 方法,会出现 TypeError 错误
user.eat(); // TypeError: user.eat is not a function

// 使用可选链操作符 (?.),当 eat 方法不存在时,不会出现错误,直接返回 undefined
user.eat?.(); // undefined
  1. 访问对象属性(使用数组下标)
const foods = ['鸡蛋', '豆腐', '小咸菜'];
// foods 数组中有第 1 个元素,不会出现错误
console.log(foods[0]); // "鸡蛋"
// foods 数组中没有第 4 个元素,会出现 TypeError 错误
console.log(foods[3]); // TypeError: Cannot read property '3' of undefined

// 使用可选链操作符 (?.),当第 4 个元素不存在时,不会出现错误,直接返回 undefined
console.log(foods[3]?.color); // undefined

可选链操作符在 React 中的应用

在 React 组件开发中,我们经常需要访问 props 对象的属性值。如果某个属性不存在,会导致程序终止执行,为了避免这种情况,我们可以使用可选链操作符来访问 props 对象属性:

function Component(props) {
  return (
    <div>
      <p>姓名:{props.user?.name}</p>
      <p>年龄:{props.user?.age}</p>
    </div>
  );
}

// 渲染组件时,传递的 props 对象中没有 user 属性,不会报错
ReactDOM.render(<Component />, document.getElementById('root'));

总结

可选链操作符是 ECMAScript 2021 中新增的功能,可以在安全的情况下访问对象的属性或方法,避免了出现 TypeError 错误。在 React 组件开发中,可选链操作符可以避免访问 props 对象属性时出现错误。大家在开发中可以灵活运用可选链操作符,提升代码健壮性和稳定性。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a8e554add4f0e0ff225aa7


纠错反馈