空值合并运算符 '??'

245 阅读2分钟

这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

前言

  • 续接前文介绍逻辑运算符,这次来单独谈谈空值合并运算符

简介

  • 由于这是一个JavaScript新特性,旧式浏览器可能需要polyfills做一下兼容
  • 下面来看看这段代码 :a ?? b

含义是,如果a是已定义的,结果为a,否则为b.换句话说,如果第一个参数不是 null/undefined,则 ?? 返回第一个参数。否则,返回第二个参数。

  • 实际上,它也可以用三元运算符表示:

result = (a !== null && a !== undefined) ? a : b;

  • 也可以使用或逻辑运算符 result = (a || b)

使用场景

  • 当用户名没有被定义,这时我们可以给它个默认值.
let user; 
alert(user ?? "匿名"); // 匿名(user 未定义)

user = "John";
 alert(user ?? "匿名"); // John(user 已定义)

|| 与 ??

  • 前面可以看到,实际||也可以实现和??比较类似的效果,那为什么增加这个新的运算符

  • 它们之间重要的区别是:

  • || 返回第一个  值。

  • ?? 返回第一个 已定义的 值。

换句话说,|| 无法区分 false0、空字符串 "" 和 null/undefined。它们都一样 —— 假值(falsy values)。如果其中任何一个是 || 的第一个参数,那么我们将得到第二个参数作为结果。这就导致我们想要例如0、‘’这种初始值,或运算符是无法达到的

let height = 0; 
alert(height || 100); // 100 
alert(height ?? 100); // 0

从这段代码看,很显然??运算符是达到我们的目的了

优先级

  • 空值合并运算符在 = 和 ? 运算前计算,但在大多数其他运算(例如 + 和 *)之后计算。

?? 与 && 或 || 一起使用

出于安全原因,JavaScript 禁止将 ?? 运算符与 && 和 || 运算符一起使用,除非使用括号明确指定了优先级。

下面的代码会触发一个语法错误:

let x = 1 && 2 ?? 3; // Syntax error

这个限制无疑是值得商榷的,它被添加到语言规范中是为了避免人们从 || 切换到 ?? 时的编程错误。

可以明确地使用括号来解决这个问题:

let x = (1 && 2) ?? 3; // 正常工作了

alert(x); // 2