值为undefined时,可选链+空值合并与逻辑或运算符的差异及优选方案
可选链+空值合并 vs 逻辑或:区别与推荐方案
一、undefined场景下的表面巧合
你给出的示例里,api.entry是undefined,所以两种写法输出结果确实一致,都是{ foo: 'Not found' }。但这只是特定值下的巧合,二者的核心逻辑差异很大。
二、核心区别:判断"空值"的标准完全不同
- 逻辑或
||:把所有假值都当成"空",包括undefined、null、''(空字符串)、0、false、NaN。只要左侧是这些值,就会返回右侧默认值。 - 空值合并
??:只认undefined和null是"空",其他假值(比如0、''、false)会被当作有效保留值。
换几个实际场景的例子,差异立刻就出来了:
// 场景1:接口返回0(有效数值,比如库存为0) const api1 = { entry: 0 } console.log(api1.entry || 'Not found') // 输出'Not found'——错误,把有效数值0当成了空值 console.log(api1.entry ?? 'Not found') // 输出0——正确保留有效数值 // 场景2:接口返回空字符串(有效内容,比如用户主动填写了空昵称) const api2 = { entry: '' } console.log(api2.entry || 'Not found') // 输出'Not found'——错误 console.log(api2.entry ?? 'Not found') // 输出''——正确保留用户输入 // 场景3:api对象本身可能不存在 const api3 = undefined console.log(api3.entry || 'Not found') // 直接报错:Cannot read properties of undefined console.log(api3?.entry ?? 'Not found') // 输出'Not found'——可选链安全处理了对象不存在的情况
三、推荐方案:优先用?. + ??组合
原因很直白:
- 判断更精准:符合大部分业务需求——只有当值真的是"未定义/不存在"(
undefined/null)时才用默认值,不会误把有效假值替换掉。 - 访问更安全:可选链
?.能避免对象/属性不存在时的报错,这是||做不到的,比如上面api3的场景。 - 语义更清晰:代码直接表达了"如果这个属性存在且不是null/undefined,就用它,否则用默认值"的逻辑,可读性更强。
只有当你明确需要把所有假值都当成无效值替换时(比如判断用户是否输入了有效内容,空字符串也视为无效),再考虑用||。
内容的提问来源于stack exchange,提问作者Álvaro
相关产品推荐
相关产品推荐

