ES2020 空值合并操作符??和可选链操作符?.

本文介绍了ES2020引入的空值合并操作符(??)和可选链操作符(?.),如何改进js代码的健壮性,尤其是在处理null和undefined值时,以及如何在Vue2.0中通过babel插件实现这些新特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在之前的开发中,由于很多时候后台接口对数据库没有的值,直接就不会返回对应的字段,于是js里写了很多let result = resp.data || """或者三元运算符?:之类的。

对于查询接口,后端有时候会说,如果查询默认值或者全选,你就传个null或者空呗,于是又写了params.id = params.id || null。显然这样不严谨的写法会引出很多问题,比如id为0时。

针对这一问题,ES2020引入了新的操作符——空值合并操作符(??),很简单,类似于或操作符 || ,它只判断 x ?? y,当x为null 或者 undefined的时候,返回y;否则返回x。

于是let a = 0 ?? 1的时候,a就为0;let b = "" ?? "呵呵",b值为""。避免了尴尬的if(x === null || typeOf(x) === "undefined")这种拉跨写法。


另一个场景,对深层嵌套的对象,很多人都写过类似:

let result = resp && resp.data && resp.data.item;

这里就要感谢一下ES2020新增的另一个操作符——可选链操作符(?.),其作用就是为了避免直接取对象值时造成的引用无效问题。它与 操作符其实一样,只是当引用为空的时候不会抛出错误,而是将结果返回为undefined,比较友好。

语法:

obj?.prop
obj?.[expr]
arr?.[index]
func?.(args)

所以上面的例子就可以变为:

let result = resp?.data?.item;


呼呼,在代码里是不是试了一下,发现vscode报错了,说"??"是unexpected token,emmmm,现在ts 3.7支持这俩操作符,想在vue2.0里用啊,要安装babel插件。

@babel/plugin-proposal-optional-chaining

@babel/plugin-proposal-nullish-coalescing-operator

然后在babel的配置文件里加:

{  "plugins":

[  "@babel/plugin-proposal-nullish-coalescing-operator",  

  "@babel/plugin-proposal-optional-chaining"  

]

}

可能会碰到启动项目时报错说babel/core找不到,这里要保证babel loader版本号是8.x并且babel core版本号是7.x,如果babel-core还是6.x依旧不能用,需要升级babel:

npx babel-upgrade --write

然后再启动会说babel loader不知道应该加载core的6.x还是7.x,所以更新一下环境:

cnpm i babel-core@^7.0.0-bridge.0 @babel/core regenerator-runtime

最后再启动项目,可以了。


顺便一提,在ES2021里,还增加了一些赋值运算符:&&=、||= 和 ??=

1、&&= :相当于 x=x && y,即if (x) { x = y };

2、||= :相当于 x = x || y,即if (!x) { x = y };

3、??= :相当于x = x ?? y,即 if (x==null || x == undefined) { x = y };

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值