在这之前,如果读取对象内部的某个属性,往往需要判断一下,属性的上层对象是否存在。否则跨级的对象会报错。
多层级的 && 看起来会非常臃肿,es6在引入 链判断运算符 ?. 后 极大的简化了判断方法:?.直接在链式调用的时候判断,相当于一种短路机制,左侧的对象是否为 null
或 undefined
就不再往下运算,直接返回 undefined
。
判断上层对象是否存在
a?.b?.c?.d
等同于
a && a.b && a.b.c && a.b.c.d
两种写法:
a?.b
a?.[c]
判断对象方法是否存在
getName?.()
如果有定义,就会调用该方法,否则返回undefined
禁用场合
//不能用于构造函数
new a?.()
new a?.b()
//不能用于判断右侧有模板字符串
a?.`{b}`
a?.b`{c}`
// 不能用于赋值运算符左侧
a?.b = c
// 不能跟随十进制数值
a?.3 将被视为 未完成的 a ? .3 : ''