?. 可选链操作符
const obj = {}
// console.log(obj.msg.info) // 这句会报错,不信你试试
console.log(obj && obj.msg && obj.msg.info)
console.log(obj ?. msg ?. info)
// 读取对象深处的属性的值,而不必明确验证链中的每个引用是否有效, 如果深层没有该值你还使用.读取会报错
?? 空值合并操作符
// 使用?? 运算符
console.log(null ?? 1) // 1
console.log(undefined ?? 2) // 2
console.log(0 ?? 3) // 0
console.log(false ?? 4) // false
console.log("" ?? 1) // ""
// 使用|| 运算符
console.log(null || 1) // 1
console.log(undefined || 2) // 2
console.log(0 || 3) // 3
console.log(false || 4) // 4
console.log("" || 5) // 5
// 使用?? 当左侧的操作数为 null 或者 undefined,使用的是后面的数据,其他的皆使用运算符前面的数据
// 使用|| 当左侧的操作数为真就使用的是前面的数据,为假就使用的是后面的数据