??是什么? 是一个新添加的空值合并运算符 如何去用?
a ?? b 的结果是?
如果 a 是已定义的,结果是 a
如果 a 不是已定义的,结果是 b
a ?? b 也可以写成这样
let result = (a !== null && a !== undefined) ? a : b
解决了什么? ?? 的常见使用场景是提供默认值 在这里 user 的值不为 null/undefined 则显示user ,反之显示匿名
let user;
alert(user ?? "匿名"); // 匿名(user 未定义)
假设我们在变量 firstName、lastName 或 nickName 中存储着一个用户的数据。如果用户决定不填写相应的值,则所有这些变量的值都可能是未定义的。 我们想使用这些变量之一显示用户名,如果这些变量的值都是 null/undefined,则显示 “匿名”。 让我们使用 ?? 运算符来实现这一需求:
let firstName = null;
let lastName = null;
let nickName = "Supercoder";
// 显示第一个已定义的值:
alert(firstName ?? lastName ?? nickName ?? "匿名");
与 || 来对比 在上面的代码中,用 || 进行替代结果也不变。你可能有疑问,那 ?? 是来干什么的? 他们之间的重要区别是
- || 返回的是一个真值
- ?? 返回的是一个已定义的值
换句话说,|| 无法区分 false、0、空字符串 "" 和 null/undefined。它们都一样 —— 假值(falsy values)。如果其中任何一个是 || 的第一个参数,那么我们将得到第二个参数作为结果。 不过在实际中,我们可能只想在变量的值为 null/undefined 时使用默认值。 例如,考虑下面这种情况:
let height = 0;
alert(height || 100); // 100
alert(height ?? 100); // 0
0 在这里是有效值,它不应该被替换成默认值。所以 ?? 得到的是正确结果