这是我参与「掘金日新计划 · 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 已定义)
|| 与 ??
-
前面可以看到,实际||也可以实现和??比较类似的效果,那为什么增加这个新的运算符
-
它们之间重要的区别是:
-
||返回第一个 真 值。 -
??返回第一个 已定义的 值。
换句话说,|| 无法区分 false、0、空字符串 "" 和 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