编程实务中,如果读取对象内部的某个属性,往往需要判断一下该对象是否存在
message = { body:{ user:{ firstName:"sufeng" } } }
第1种写法:(常规)
const firstName = message.body.user.firstName;
第2种写法: (&&)
const firstName = (message && message.body && message.body.user && message.body.user.firstName) || 'default';
第3种写法: (三元运算符)
const fooValue = fooInput ? fooInput.value : undefined
第4种写法:(链判断运算符)
const firstName = message?.body?.user?.firstName || 'default';
上边代码使用了?.运算符,直接在链式调用的时候判断,左侧的对象是否为null或undefined。如果是的,就不再往下运算,而是返回undefined。
不仅,判断对象属性,也可以判断对象方法,如果存在就立即执行。
iterator.return?.()
上面代码中,iterator.return
如果有定义,就会调用该方法,否则iterator.return
直接返回undefined
,不再执行?.
后面的部分。
链路运算符满足短路机制
a?.[++x] // 等同于 a == null ? undefined : a[++x]
上边代码中,如果是undefined或null,那么x不会进行递增运算。也就是说,链判断运算符一旦为真,右侧的表达式就不再求值。