ES2020系列之空值合并运算符 '??'


Posted in Javascript onJuly 22, 2020

空值合并运算符 ?? 提供了一种简短的语法,用来获取列表中第一个“已定义”的变量(译注:即值不是 null 或 undefined 的变量)。

a ?? b 的结果是:

  • a,如果 a 不是 null 或 undefined,
  • b,其他情况。

所以,x = a ?? b 是下面这个表达式的简写:

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

下面是一个更长一点的例子。

假设,我们有一个用户,变量 firstName、lastName 和 nickName 分别对应用户的名字、姓氏和昵称。如果用户决定不输入任何值,那么这些变量都可能是未定义的。

我们想要显示用户的名称:显示这三个变量中的一个,如果都没有设置值,则显示 "Anonymous"。
让我们使用 ?? 运算符选择第一个已定义的变量:

let firstName = null;
let lastName = null;
let nickName = "Supercoder";

// 显示第一个不是 null/undefined 的值
alert(firstName ?? lastName ?? nickName ?? "Anonymous"); // Supercoder

与 || 比较

或运算符 || 可以与 ?? 运算符以同样的方式使用。正如 上一章 所讲的,我们可以用 || 替换上面示例中的 ??,也可以获得相同的结果。

重要的区别是:

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

当我们想将 null/undefined 与 0 区别对待时,这个区别至关重要。

例如,考虑下面这种情况:

height = height ?? 100;

如果 height 未定义,则将其赋值为 100。

让我们将其与 || 进行比较:

let height = 0;

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

在这个例子中,height || 100 将值为 0 的 height 视为未设置的(unset),与 null、undefined 以及任何其他假(falsy)值同等对待。因此得到的结果是 100。

height ?? 100 仅当 height 确实是 null 或 undefined 时才返回 100。因此,alert 按原样显示了 height 值 0。

哪种行为更好取决于特定的使用场景。当高度 0 为有效值时,?? 运算符更适合。

优先级

?? 运算符的优先级相当低:在 MDN table 中为 5。

因此,?? 在大多数其他运算之后,但在 = 和 ? 之前进行运算。

如果我们需要在复杂表达式中使用 ?? 进行取值,需要考虑加括号:

let height = null;
let width = null;

// 重要:使用括号
let area = (height ?? 100) * (width ?? 50);

alert(area); // 5000

否则,如果我们省略了括号,* 的优先级比 ?? 高,会优先执行。

运算过程将等同于下面这个表达式:

// 可能不正确的
let area = height ?? (100 * width) ?? 50;

这里还有一个相关的语言级别的限制。

出于安全原因,禁止将 ?? 运算符与 && 和 || 运算符一起使用。

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

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

这个限制无疑是值得商榷的,但是它被添加到语言规范中是为了避免编程错误,因为人们开始使用 ?? 替代 ||。

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

let x = (1 && 2) ?? 3; // 起作用

alert(x); // 2

总结

空值合并运算符 ?? 提供了一种简洁的方式获取列表中“已定义”的值。

它被用于为变量分配默认值:

// 当 height 的值为 null 或 undefined 时,将 height 的值设置为 100
height = height ?? 100;

?? 运算符的优先级非常低,只略高于 ? 和 =。

如果没有明确添加括号,不能将其与 || 或 && 一起使用。

到此这篇关于ES2020系列之空值合并运算符 '??'的文章就介绍到这了,更多相关ES2020 空值合并运算符 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
AJAX分页的代码(后台asp.net)
Feb 14 Javascript
js判断字符长度以及中英文数字等
Dec 31 Javascript
javascript制作坦克大战全纪录(2)
Nov 27 Javascript
很棒的js选项卡切换效果
Jul 15 Javascript
Listloading.js移动端上拉下拉刷新组件
Aug 04 Javascript
jquery代码规范让代码越来越好看
Feb 03 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
Mar 01 Javascript
angularJs中$http获取后台数据的实例讲解
Aug 08 Javascript
使用NestJS开发Node.js应用的方法
Dec 03 Javascript
详解es6新增数组方法简便了哪些操作
May 09 Javascript
简述pm2常用命令集合及配置文件说明
May 30 Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
Apr 01 jQuery
解决vue单页面 回退页面 keeplive 缓存问题
Jul 22 #Javascript
vue移动端弹起蒙层滑动禁止底部滑动操作
Jul 22 #Javascript
在vue中实现禁止屏幕滚动,禁止屏幕滑动
Jul 22 #Javascript
vue 弹出遮罩层样式实例
Jul 22 #Javascript
vue中解决拖拽改变存在iframe的div大小时卡顿问题
Jul 22 #Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
Jul 22 #Javascript
在vue中实现禁止回退上一步,路由不存历史记录
Jul 22 #Javascript
You might like
php mysql 判断update之后是否更新了的方法
2012/01/10 PHP
php缩小png图片不损失透明色的解决方法
2013/12/25 PHP
thinkPHP分页功能实例详解
2017/05/05 PHP
php实现快速对二维数组某一列进行组装的方法小结
2019/12/04 PHP
JavaScipt基本教程之前言
2008/01/16 Javascript
JavaScript 继承使用分析
2011/05/12 Javascript
JavaScript/jQuery 表单美化插件小结
2012/02/14 Javascript
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
JavaScript获取两个数组交集的方法
2015/06/09 Javascript
js实现的二级横向菜单条实例
2015/08/22 Javascript
javascript获取系统当前时间的方法
2015/11/19 Javascript
js验证框架之RealyEasy验证详解
2016/06/08 Javascript
ES6新特征数字、数组、字符串
2016/10/01 Javascript
AngularJS过滤器filter用法分析
2016/12/11 Javascript
移动端刮刮乐的实现方式(js+HTML5)
2017/03/23 Javascript
js中apply与call简单用法详解
2017/11/06 Javascript
JavaScript实现二叉树定义、遍历及查找的方法详解
2017/12/20 Javascript
Node.js net模块功能及事件监听用法分析
2019/01/05 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
js表达式与运算符简单操作示例
2020/02/15 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
[04:03]辉夜杯主赛事 12月25日RECAP精彩回顾
2015/12/26 DOTA
[05:09]第二届DOTA2亚洲邀请赛决赛日比赛集锦:iG 3:0 OG夺冠
2017/04/05 DOTA
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
在主机商的共享服务器上部署Django站点的方法
2015/07/22 Python
Django中对通过测试的用户进行限制访问的方法
2015/07/23 Python
对pandas中to_dict的用法详解
2018/06/05 Python
python_mask_array的用法
2020/02/18 Python
解决TensorFlow训练模型及保存数量限制的问题
2021/03/03 Python
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
几个判断型的面试题
2012/07/03 面试题
数学教师求职信范文
2015/03/20 职场文书
毕业酒会致辞
2015/07/29 职场文书
2019年教师节:送给所有老师的祝福语
2019/09/05 职场文书
导游词之河北滦平金山岭长城
2019/10/16 职场文书
腾讯云服务器部署前后分离项目之前端部署
2022/06/28 Servers