1、可选链操作符( ?. )
可选链操作符( ?. )允许读取位于对象链深处的属性的值,而不必了解链中的属性是否存在。 ?.操作符的功能类似于 . 链式操作符,不同之处在于,在引用为空 (null 或者 undefined) 的情况下不会引起错误,该表达式短路返回值为undefined
开发过程中,我们可能需要获取深层次的属性,例如 system.user.addr.province.name。 但是获取 name 这个属性前需要一步步的判断前面的属性是否存在,否则并会报错,代码运行终止
比如
const name = (system && system.user && system.user.addr && system.user.addr.province && system.user.addr.province.name) || 'default';
但是,有了可选链操作符( ?. ),我们可以这样操作
const name = system?.user?.addr?.province?.name || 'default';
选链操作符将会使表达式更短、更简明。在获取一个对象的深层次属性时,如果不能确定哪些属性存在,可选链操作符是很有帮助的。如果属性不存在,会直接返回undefined,而不是报错
2、空值合并操作符(??)
在编写代码时,如果某个属性不为 null 和 undefined,那么就获取该属性,如果该属性为 null 或 undefined,则取一个默认值
以前没有空值合并操作符(??)时,是这样操作的
const name = userName ? userName : 'default';
也可以这样
const name = userName || 'default';
但是 || 的写法存在一定的缺陷,当 userName 为 0 或 false 的时候也会走到 default 的逻辑。所以 ES2020 引入了 ?? 运算符。只有 ?? 左边为 null 或 undefined 时才返回右边的值:
const userName = false;
const name = userName ?? 'default'; // name = false;