现实开发中,经常会有判断变量是否被定义的需求,然后根据它进行相应的操作:
let visitor1 = 'Kylin'
console.log(visitor1 ?? '访客') // Kylin
let visitor2
console.log(visitor2 ?? '访客') // 访客
如您所见,代码中 "??" 就是空值合并运算符。它所表达的意思是,当一个值既不是 null 也不是 undefined 时,就将其称为 "已定义的"。例如:a ?? b 的结果:
- 如果 a 是已定义的,结果就为 a,
- 如果 a 不是已定义的,结果就为 b。
空值合并也支持从一些列值中选出第一个非 null/undefined 的值:
let firstName = null
let lastName = null
console.log(firstName ?? lastName ?? '访客') // 访客
"??" 运算符与 "||" 运算符有些区别,"||" 运算符返回的是第一个真值,而 "??" 运算符返回的是第一个 "已定义的" 值。
这说明 "||" 运算符无法区分 "0, false, "", null, undefined":
let width = 0
console.log(width || 100) // 100
let width = 0
console.log(width ?? 100) // 0
JAVAScript 禁止 "??" 与 "||" 和 "&&" 混用,除非用 "括号" 明确提升它们的优先级,否则会出现语法错误。