JS的??与||的区别

108 阅读1分钟

之前忽视了这里,今天踩了个小坑,记录一下。

大致抽象一下是这样的:

let a = val ?? "ok";
// 和下面
let b = val || "ok";

// 当val为0的时候?a,b各是多少?

在JavaScript中,let a = val ?? "ok" 和 let a = val || "ok" 之间的区别主要在于它们处理falsy值的方式。

  1. 使用 || (逻辑或) 操作符

当使用 val || "ok",如果 val 是任何falsy值(例如 0""nullundefinedNaN),那么 a 会被赋值为 "ok"。这意味着,例如,如果你希望用默认值 "ok" 替换一个可能为空的字符串,使用 || 可能会导致意外的结果。

let val = 0;  

let a = val || "ok";  // a 会是 "ok",尽管 val 是一个数字
  1. 使用 ?? (空值合并) 操作符

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"