空值合并运算符(??)

空值合并运算符:??

空值合并操作符(??) 是一种逻辑操作符,当左侧的操作数为 ==null== 或者 == undefined== 时,返回右侧操作数,否则返回左侧操作数。
在JavaScript中的真值和假值 在我们研究 ?? 操作符之前,我们先来回顾JavaScript的值要么是真值要么是假值:当需要强制转换成Boolean的时候,一个值要么是true 要么是false。在JavaScript里,下面的值被认为是假值:
  • false
  • 0
  • -0
  • 0n
  • NaN
  • “”
  • null
  • undefined
剩下的其他值在被转换成Boolean值的时候都是true,被认为是真值。
用 ?? 提供默认值 当一个值是null或者undefined的时候?? 操作符可以提供一个默认值。它需要两个操作数:
value ?? fallbackValue;

如果左操作的结果是 null或undefined,?? 表达式会使用右操作的结果
null ?? "n/a"; // "n/a"undefined ?? "n/a"; // "n/a"

如果左操作不是 null或undefined,都是使用左操作
false ?? true; // false0 ?? 100; // 0NaN ?? 0; // NaN

以上所有的左侧操作数都是“假值”,但是 ??中还是得到左侧操作数。
【空值合并运算符(??)】如果我们使用 || (逻辑或运算符) 代替 ??, 以上所有的表达式都会使用右侧操作数。
false || true; // true0 || 100; // 100NaN ?? 0; // 0

以上的结果差异就是为什么不能用|| 给nullabled值提供一个默认值。 结果可能和我们想要的不一样。
type Options = { prettyPrint?: boolean; }function serializeJSON(value: unknown, options: Options): string { const prettyPrint = options.prettyPrint ?? true; // ... }

表达式 options.perttyPrint ?? true 是在perttyPrint的值是null或undefined的时候,提供一个默认值true。 如果perttyPrint的值是false,即 false ?? true 得到的结果是false,这是我们想要的结果。
如果这里的 ?? 换成 ||,结果就不是我们预期的。 当perttyPrint的值是null或undefined的时候 最终表达式结果为true,这是符合预期的。 如果perttyPrint的值是false,false || true 仍然得到true,这不是我们想要的结果。所以这种情况下,必须使用 ??.

    推荐阅读