当我们想要安全的访问一个对象的属性时,我们不希望他报错,而是给我们返回 undefined 或者 null;
这时我们就可以选择可选链 ?. 来对属性进行访问;
传统的访问方式,例如:user.address.street ,如果address 或者 street 不存在,那么我们就会收到一个错误;
我们可以使用 if 语句进行判断,但是这不够优雅,例如:
alert(user.address ? user.address.street ? user.address.street.name : null : null);
或者
alert( user.address && user.address.street && user.address.street.name );
但如果我们使用:user?.address?.street 这样的方式,如果 address 不存在,那么就会给我们返回 undefined 。
注意- ?. 只对他前面的值进行判断,例如 user?.address.street ,如果 user 不存在(已声明)那么就会返回 undefined ,但是如果 user 存在,address 不存在,我们就需要在 address 和 street 中间也加入可选链才能对 address 进行判断;
- ?. 前的变量必须已经声明,可以没有被赋值,但一定要确保已经声明,不然也会报错;
- 可选链也具有短路效应,如果左边的表达式判断为不存在,那么就会立即停止继续运算;
- 可选链是不是一个运算符,而是一个特殊的语法结构,它还可以与函数和方括号一起使用,例如可以用这个判断一个函数是否存在:
5.还可以和 delete 关键字一起使用,例如:
delete user?.name; //如果 user 存在,就删除 user.name
6.在可选链可以用来安全的读取或者删除,但是不能用于赋值语句,例如:
user?.name = ‘John’; //Error
总结
可选链 ?. 语法有三种形式:
- obj?.prop —— 如果 obj 存在则返回 obj.prop,否则返回 undefined。
- obj?.[prop] —— 如果 obj 存在则返回 obj[prop],否则返回 undefined。
- obj.method?.() —— 如果 obj.method 存在则调用 obj.method(),否则返回 undefined。
正如我们所看到的,这些语法形式用起来都很简单直接。?. 检查左边部分是否为 null/undefined,如果不是则继续运算。
?. 链使我们能够安全地访问嵌套属性。
但是,我们应该谨慎地使用 ?.,仅在当左边部分不存在也没问题的情况下使用为宜。以保证在代码中有编程上的错误出现时,也不会对我们隐藏。可选链 ?. 语法有三种形式:
- obj?.prop —— 如果 obj 存在则返回 obj.prop,否则返回 undefined。
- obj?.[prop] —— 如果 obj 存在则返回 obj[prop],否则返回 undefined。
- obj.method?.() —— 如果 obj.method 存在则调用 obj.method(),否则返回 undefined。
正如我们所看到的,这些语法形式用起来都很简单直接。?. 检查左边部分是否为 null/undefined,如果不是则继续运算。
?. 链使我们能够安全地访问嵌套属性。
但是,我们应该谨慎地使用 ?.,仅在当左边部分不存在也没问题的情况下使用为宜。以保证在代码中有编程上的错误出现时,也不会对我们隐藏。