之前忽视了这里,今天踩了个小坑,记录一下。
大致抽象一下是这样的:
let a = val ?? "ok";
// 和下面
let b = val || "ok";
// 当val为0的时候?a,b各是多少?
在JavaScript中,let a = val ?? "ok" 和 let a = val || "ok" 之间的区别主要在于它们处理falsy值的方式。
- 使用
||(逻辑或) 操作符:
当使用 val || "ok",如果 val 是任何falsy值(例如 0, "", null, undefined, NaN),那么 a 会被赋值为 "ok"。这意味着,例如,如果你希望用默认值 "ok" 替换一个可能为空的字符串,使用 || 可能会导致意外的结果。
let val = 0;
let a = val || "ok"; // a 会是 "ok",尽管 val 是一个数字
- 使用
??(空值合并) 操作符:
val ?? "ok" 只有在 val 是 null 或 undefined 时才会将 a 赋值为 "ok"。这意味着,如果 val 是 0、空字符串 ""、NaN 或其他“falsy”但不是 null 或 undefined 的值,那么 a 将被赋值为 val。
let val = 0;
let a = val ?? "ok"; // a 会是 0,因为 val 不是 null 或 undefined
总结一下,主要的区别在于:
- 使用
||时,所有falsy值都会导致赋值为"ok"。 - 使用
??时,只有null或undefined会导致赋值为"ok"。