可选链、空值合并与浮点精度
先理解原理和示例,再练习完整口述与追问。
回答要点
只对 null/undefined 短路;0 和空串;十进制精度。
原理拆解
可选链只在左侧为 null 或 undefined 时短路,不能吞掉任意异常;空值合并 ?? 也只为这两种值提供默认值。|| 对所有假值生效,会覆盖合法的 0、false 和空字符串。浮点误差来自有限二进制表示,很多十进制小数无法精确表示,比较和金额计算需要按业务精度设计,而不是到处随意加一个固定容差。
示例与推演
const data = { count: 0 }
console.log(data.count || 10) // 10
console.log(data.count ?? 10) // 0
console.log(data.user?.name ?? '匿名') // 匿名
console.log(0.1 + 0.2 === 0.3) // false
金额可按约定转最小单位整数运算并规定舍入;超出安全整数范围则需要字符串、BigInt 或合适的十进制方案。
易错点
obj?.method() 仍要求存在的 method 可调用;希望方法也可选可用 obj?.method?.(),但非函数仍会报错。可选链不是让缺失必需字段静默通过的理由。
参考回答可直接练习口述
可选链 ?. 在左侧为 null 或 undefined 时短路,不能让所有错误消失;?? 仅为空值提供默认,|| 还会把 0、false、空串当作需要替换的值。JS 常见 Number 是二进制浮点,所以 0.1 + 0.2 不一定精确等于 0.3。金额按业务使用最小单位整数或可靠十进制方案,并控制数值范围、舍入和后端校验,不能简单用任意 epsilon 处理所有金额。