ES2020新语法:可选链操作符

news/2024/11/9 9:34:43/

目录

一、前言

二、案例

三、方法一:AND运算符

四、方法二:可选链操作符( ?. )

1. 语法

2. 可选链与函数调用

3. 处理可选的回调函数或事件处理器

4.可选链和表达式

5.可选链访问数组元素

6.使用空值合并操作符


一、前言

今天看一个实习生写的代码,Po一个截图:

我是个菜鸡,我是真的没有【item?.Name】这么用过,我也不知道是啥意思。

然后查了一下,叫做: 可选链操作符 ( ?. )

二、案例

 项目中一个很常见的场景,从接口返回的数据,对象中的某个属性可能不存在,即 undefined ;或者尝试获取 DOM 元素,该元素不存在,即 null 。

下面是 MDN 官方的例子,cat 属性可能不存在:

const adventurer = {name: 'Alice',cat: {name: 'Dinah'}
};

 如果想要访问 cat 的 name 属性,像下面这样可能会报错:

const name = adventurer.cat.name

Uncaught TypeError: Cannot read property ‘name’ of undefined

如果 cat 属性不存在,那么 adventurer.cat 的值就是 undefined 。在 undefined 上访问 name 就会出现上面的报错信息。一旦报错,这段代码的执行就中断了,进而影响其他代码的执行甚至阻塞页面加载。 

那如何解决?

三、方法一:AND运算符

而在项目中为了避免出现报错, 我们的作法是这样的:

const name = adventurer && adventurer.cat && adventurer.cat.name

AND运算符 && 当左边的表达式为 true ,不管右边表达真假,都返回右边的表达式;当左边表达式为 false 直接返回左边的表达式。

缺点:

当访问的属性嵌套了很多层,校验的语句会变得很长,影响代码可读性。

四、方法二:可选链操作符( ?. )

可选链操作符( ?. ) 允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。

?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为空 ( null 或者 undefined) 的情况下不会引起错误,该表达式短路返回值是 undefined。

当尝试访问可能不存在的对象属性时,可选操作符将会使表达式更短、更简明。在去访问一个对象的内容时,如果不能确定哪些属性存在时,可行链操作符是很有帮助的。

const myInfo = {name: '007',like: 'novel',
}
// 使用可选链进行获得对象属性
console.log(myInfo.school?.name) // 输出undefined
// 使用可选链进行函数调用
console.log(myInfo.action?.read()) // 输出undefined

1. 语法

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

2. 可选链与函数调用

当尝试调用一个可能不存在的方法时也可以使用可选链。这将是很有帮助的,比如,当使用一个API的方法可能不可用时,要么因为实现的版本问题,要么因为当前用户的设备不支持该功能。

函数使用时如果被调用的方法不存在,使用可选链可以使表达式自动返回undefined而不是抛出一个异常。

let result = someInterface.customMethod?.();

3. 处理可选的回调函数或事件处理器

如果通过解构获得一个对象的回调函数或fetch方法,你可能得到不存在的值,从而不能当做函数直接调用,除非你已经校验了他们的存在性。使用?.的你可以忽略这些额外的校验:

//  ES2019的写法
function doSomething(onContent, onError) {try {// ... do something with the data}catch (err) {if (onError) { // 校验onError是否真的存在onError(err.message);}}
}
// 使用可选链进行函数调用
function doSomething(onContent, onError) {try {// ... do something with the data}catch (err) {onError?.(err.message); // 如果onError是undefined也不会有异常}
}

4.可选链和表达式

当使用方括号与属性名的形式来访问属性时,你也可以使用可选链操作符:

let nestedProp = obj?.['prop' + 'Name'];

5.可选链访问数组元素

let nestedProp = obj?.['prop' + 'Name'];

6.使用空值合并操作符

空值合并操作符可以在使用可选链时设置一个默认值:

let myInfo = {name: '007',
};
let mySex = myInfo?.sex ?? 'man';
console.log(mySex); // man

这里的 ?? 是 Nullish Coalescing 运算符,它的作用是在左侧的表达式值为 null 或 undefined 时,返回右侧的默认值。在这个例子中,如果 myInfo?.sex 的值为 null 或 undefined,则 mySex 的值将被设置为 'man'。如果 myInfo?.sex 的值不为 null 或 undefined,则 mySex 的值将被设置为 myInfo?.sex 的值。


http://www.ppmy.cn/news/93274.html

相关文章

RK3399平台开发系列讲解(网络篇)DNS协议

🚀返回专栏总目录 文章目录 一、DNS 服务器二、DNS 解析流程三、负载均衡沉淀、分享、成长,让自己和他人都能有所收获!😄 📢DNS 是网络世界的地址簿,可以通过域名查地址,因为域名服务器是按照树状结构组织的,因而域名查找是使用递归的方法,并通过缓存的方式增强性能…

使用Fiddler工具抓取微信小程序中的图片,使用Fiddler工具抓取电脑访问的链接图片

背景: 开发微信小程序的时候,是不是经常看到别人的小程序中某个图标或者图片好看想用,下面小编给大家分享一下怎么获得微信小程序中的图片。 一.什么是Fiddler 官网:https://www.telerik.com/ 下载地址1:Fiddler4_官方…

第1章 Nginx简介

基于 Nginx版本 1.14.2 ,Tomcat版本 9.0.0 演示 第1章 Nginx简介 1.1 Nginx发展介绍 Nginx (engine x) 是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器。 Nginx 特点是占有内存少,并发处理能力…

【Python】csv与json,哪个才是你的数据之选?

知识目录 一、写在前面✨二、读写csv文件2.1 什么是CSV文件2.2 csv文件的优点2.3 应用 三、读取json文件3.1 json介绍3.2 例题 四、总结撒花😊 一、写在前面✨ 大家好!我是初心,希望我们一路走来能坚守初心! 今天跟大家分享的文…

驱动 5-23

驱动IO三种模型 非阻塞IO: 当在应用程序中读取硬件数据时,不管硬件数据有没有准备好,read()函数不会阻塞住,而是继续向下执行。 在应用程序中用open函数以非阻塞的方式打开文件,会直接使用驱动程序中的mycdev_read()函数的内容…

【信息系统项目管理师】十大管理——1、整合管理

十大管理——1、整合管理 项目背景 项目概况 2021年6月,我有幸作为项目经理主持了“某省广电网络工程资源管理系统”项目的建设工作,该项目中标金额为888万元,建设工期为5年,该项目是该省广电网络公司的重点项目。 该项目整合…

Java中异常的处理及捕获

Java中异常的处理及捕获 一、异常的概述 (1)Java中异常的作用:增强程序的健壮性 (2)在Java中所有的Error(错误)和异常(Exception)都继承了同一个父类Throwable 二、异…

[元带你学: eMMC完全解读 9] 设备怎么复位到预空闲(Pre-Idle)状态

依JEDEC eMMC 5.1及经验辛苦整理,付费内容,禁止转载。 所在专栏 《元带你学: eMMC完全解读》 前言 在引导操作模式下,host (e-MMC主机)可以在发出CMD1之前,通过保持CMD线低电平或发送带有+0xFFFFFFFA参数的CMD0,才Device(e-MMC设备)读取引导Boot数据。根据寄存器设置,可…