可选链运算符

使用

安全读取属性

允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效

js
const data = {
  age: 18,
  friend: {
    name: '李四',
  },
  name: '张三',
  sex: '男',
};

console.log(data.friend.name);

假设 data 是通过 ajax 获取的数据,data.friend.name 存在,则可以正常输出,如果不存在:

js
console.log(data.friend.name); // 报错:Uncaught TypeError: Cannot read property 'name' of undefined

所以这个时候我们平时就要做很多判断

js
console.log(data && data.friend && data.friend.name); // undefined

有了可选链运算符(?.)后,我们可以直接简写成

js
console.log(data?.friend?.name);

函数调用

js
if (onError) { // 校验 onError 是否真的存在
  onError(err.message);
}

onError?.(err.message); // 简写

表达式

当使用方括号与属性名的形式来访问属性时,你也可以使用可选链运算符:

js
const nestedProp = obj?.['prop' + 'Name'];

数组元素

js
const arrayItem = arr?.[42];

短路计算

当在表达式中使用可选链时,如果左操作数是 null 或 undefined,表达式将不会被计算

js
const potentiallyNullObj = null;
let x = 0;
const prop = potentiallyNullObj?.[x++];

console.log(x); // x 将不会被递增,依旧输出 0

注意

? 前面的变量只能是 null 或 undefined,否则不会返回 undefined

js
const a = false;
console.log(a?.split(',')); // a?.split is not a function

不能用于赋值

js
let object = {};
object?.property = 1; // Uncaught SyntaxError: Invalid left-hand side in assignment