?? 是根据 null 和 undefined 判断的,
|| 是根据 布尔值 false 判断的, 左侧为true 不看右侧
&& 左侧为false 不看右侧
?. "可选链操作符",允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。在引用 null 或者 undefined 的情况下不会引起错误(主要是用于防止报错!)
一、&& 是与运算,左侧true返回右侧,左侧false直接返回左侧
let aa = true && false // aa是 false
let aa = false && true // aa是false
二、|| 是或运算,左侧true返回左侧,左侧false直接返回右侧
let aa = true || false // aa是true
let aa = false || true // aa是true
三、??空值合并操作符,只有当左侧是null和undefind,才会返回右侧,其余情况返回左侧,和 || 运算符类似,又有不同 || 运算符当左侧是假值的情况就会返回右侧,如 0 或者 ""
let aa = null ?? 1 // aa是1
let aa = null || 1 // aa是1
let aa = undefind ?? 1 // aa是1
let aa = undefind || 1 // aa是1
let aa = 0 ?? 1 // aa是0
let aa = 0 || 1 // aa是1
let aa = "" ?? 1 // aa是""
let aa = "" || 1 // aa是1
四、?.可选链操作符 a?.b 当a存在是返回a.b
let a = {}
let aa = a?.b // aa是undefind
let aa = a?.b ?? 123 // aa是123
let a = {b:1}
let aa = a?.b // aa是1