JavaScript | 再也不用写烦人的非空判断了,JavaScript可选链操作符?.----真香!
简介:
可选链操作符(
?.
)允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?.
操作符的功能类似于.
链式操作符,不同之处在于,在引用为空[null]
或者[undefined]
的情况下不会引起错误,该表达式短路返回值是undefined
。与函数调用一起使用时,如果给定的函数不存在,则返回undefined
。
当尝试访问可能不存在的对象属性时,可选链操作符将会使表达式更短、更简明。在探索一个对象的内容时,如果不能确定哪些属性必定存在,可选链操作符也是很有帮助的。
语法:
obj?.prop
obj?.[expr]
arr?.[index]
func?.(args)
举例:
通过链接的对象的引用或函数可能是undefined或者null时,可选链操作符提供了一种方法来简化对被链接对象的值的访问。
比如:一个存在嵌套结构的对象obj。不使用可选链操作符的话,查找obj的一个深度嵌套的子属性时,需要验证之间的引用,例如:
let name = obj.person && obj.person.name;
使用可选链操作符的写法如下:
let name =obj.person?.name;
下面的例子中我们想获取obj对象中person对象的name属性,
如果我们的obj是如下定义,那么是可以正常取到值得:
let obj = {
person: {
name: '张三'
}
}
/* 首先我们不进行判断直接取值*/
let name = obj.person.name;
console.log("name:", name)
打印输出:
以上是正常情况,那如果我们定义的obj对象中没有person对象
代码如下:
let obj = {
// person: {
name: '张三'
// }
}
/*没有person对象的情况下不进行判断直接取值*/
let name = obj.person.name;
console.log("name:", name)
输出结果:可以看到报错无法读取未定义的属性
那么在实际的开发中呢,我们可能不能确定对象中到底有没有想要的属性,这时候我们就需要自行判断,那还是上面的例子,我们加入判断:
let obj = {
// person: {
name: '张三'
// }
}
/*没有person对象的情况下用常规判断方式取值*/
let name = obj.person && obj.person.name;
console.log("name:", name)
可以看到输出结果如下:最起码没有报错了
以上是常规判断方式,试想一下,如果对象嵌套层级很深,这样写是很麻烦的,所有就有了下面这种判断方式:可选链式操作符:
let obj = {
// person: {
name: '张三'
// }
}
/*没有person对象的情况下用可选链操作符判断进行取值*/
let name =obj.person?.name;
console.log("name:", name)
输出结果:可以看到结果是一样的,程序也没有报错
通过使用 ?.
操作符取代 .
操作符,JavaScript 会在尝试访问 obj.person.name
之前,先隐式地检查并确定 obj.person
既不是 null
也不是 undefined
。如果obj.person
是 null
或者 undefined
,表达式将会短路计算直接返回 undefined
。
该文章参考地址:
可选链操作符 - JavaScript | MDN (mozilla.org)
我这里只说到了一点浅显的用法,想深入了解的同学可以前往以上地址。
转载自:https://juejin.cn/post/7096121303303716894