?.这个是什么东东?论js好玩的运算符

157 阅读1分钟

写代码时看到一个奇怪的东东

this.tableData.push(new Array(this.tableData[0]?.length || 1).fill(' '))

其中一个奇奇怪怪的?.看懂不懂。看不懂怎么办呢,当然是百度一下啦

ES2020 新语法:可选链操作符( ?. )

obj?.prop  // 获取obj中的属性
obj?.[expr] // 根据obj是否存在来执行[]内的表达式
arr?.[index] // 获取arr中的元素
func?.(args) // 根据func是否存在来执行函数

日常开发中,当需要访问嵌套在对象内部好几层的属性时,可能就会得到臭名昭著的错误Uncaught TypeError: Cannot read property...,这种错误,让整段程序运行中止。

let obj = {
    name: 'jone',
    age:16,
    school: {
      name: '哈佛大学',
      address: '剑桥',
    }
}
let schoolName = obj && obj.school && obj.school.name // 哈佛大学
let homeName = obj.home.address // Uncaught TypeError: Cannot read property 'address' of undefined
let homeName = obj && obj.home && obj.home.address // undefined

于是,你就要修改你的代码来处理来处理属性链中每一个可能的undefined对象,比如:

let homeName = obj.home?.address ?? '哈佛大学'. // 哈佛大学

兄弟们很好用啊,可以和后端预定参数是再也不怕他提再等一下还没发

只要定好参数直接 可选链操作符( ?. )空值合并运算符(??) 想要什么预设值直接取,再也不怕报undefined。

兼容性问题

Snipaste_2023-10-07_16-11-00.png 差不多可以满足绝大部分的浏览器需求了,如果不需要兼容IE放心大胆的使用。

除此以外还有一些好玩的运算符也可以试着使用

//||=  逻辑 OR 赋值 ( x ||= y) 运算符仅在x为假时赋值。
const a = { duration: 50, title: '' };

a.duration ||= 10;
console.log(a.duration);
// expected output: 50

a.title ||= 'title is empty.';
console.log(a.title);
// expected output: "title is empty"