JavaScript | 再也不用写烦人的非空判断了,JavaScript可选链操作符?.----真香!

JavaScript | 再也不用写烦人的非空判断了,JavaScript可选链操作符?.----真香!

一月 02, 2022
该文章更新于 2022.01.02

简介:

可选链操作符( ?. )允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为空(nullish ) ([null](<https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/null>) 或者 [undefined](<https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/undefined>)) 的情况下不会引起错误,该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined

当尝试访问可能不存在的对象属性时,可选链操作符将会使表达式更短、更简明。在探索一个对象的内容时,如果不能确定哪些属性必定存在,可选链操作符也是很有帮助的。

语法:

1
2
3
4
obj?.prop
obj?.[expr]
arr?.[index]
func?.(args)

举例:

通过链接的对象的引用或函数可能是undefined或者null时,可选链操作符提供了一种方法来简化对被链接对象的值的访问。

比如:一个存在嵌套结构的对象obj。不使用可选链操作符的话,查找obj的一个深度嵌套的子属性时,需要验证之间的引用,例如:

1
let name = obj.person && obj.person.name;

使用可选链操作符的写法如下:

1
let name =obj.person?.name;

下面的例子中我们想获取obj对象中person对象的name属性,

如果我们的obj是如下定义,那么是可以正常取到值得:

1
2
3
4
5
6
7
8
let obj = {
person: {
name: '张三'
}
}
/* 首先我们不进行判断直接取值*/
let name = obj.person.name;
console.log("name:", name)

打印输出:

image-20220102005305316

以上是正常情况,那如果我们定义的obj对象中没有person对象

代码如下:

1
2
3
4
5
6
7
8
let obj = {
// person: {
name: '张三'
// }
}
/*没有person对象的情况下不进行判断直接取值*/
let name = obj.person.name;
console.log("name:", name)

输出结果:可以看到报错无法读取未定义的属性

image-20220102005326041

那么在实际的开发中呢,我们可能不能确定对象中到底有没有想要的属性,这时候我们就需要自行判断,那还是上面的例子,我们加入判断:

1
2
3
4
5
6
7
8
let obj = {
// person: {
name: '张三'
// }
}
/*没有person对象的情况下用常规判断方式取值*/
let name = obj.person && obj.person.name;
console.log("name:", name)

可以看到输出结果如下:最起码没有报错了

image-20220102005338088

以上是常规判断方式,试想一下,如果对象嵌套层级很深,这样写是很麻烦的,所有就有了下面这种判断方式:可选链式操作符:

1
2
3
4
5
6
7
8
let obj = {
// person: {
name: '张三'
// }
}
/*没有person对象的情况下用可选链操作符判断进行取值*/
let name =obj.person?.name;
console.log("name:", name)

输出结果:可以看到结果是一样的,程序也没有报错

image-20220102005353650

通过使用 ?. 操作符取代 . 操作符,JavaScript 会在尝试访问 obj.person.name 之前,先隐式地检查并确定 obj.person 既不是 null 也不是 undefined。如果obj.personnull 或者 undefined,表达式将会短路计算直接返回 undefined

该文章参考地址:

可选链操作符 - JavaScript | MDN (mozilla.org)

我这里只说到了一点浅显的用法,想深入了解的同学可以前往以上地址。