可选链运算符(?.)与空值合并运算符(??)

news2024/12/27 14:28:47

1. 可选链运算符Optional chaining(?.)

MDN定义

可选链运算符(?.)允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 运算符的功能类似于 . 链式运算符,不同之处在于,在引用为空 (nullish ) (null 或者 undefined) 的情况下不会引起错误,该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined。
当尝试访问可能不存在的对象属性时,可选链运算符将会使表达式更短、更简明。在探索一个对象的内容时,如果不能确定哪些属性必定存在,可选链运算符也是很有帮助的。

语法

obj.val?.prop
obj.val?.[expr]
obj.func?.(args)

使用场景

{/* 组件使用时通过props传入数据 */}
 <CardTableList database={eShare.rollback}/>

{/* 组件内逻辑如下 */}
const CardTableList = ({ database }) => {

  return (
    <>
      <Collapse defaultActiveKey={['loan_order', 'mv_run_result']} expandIconPosition="end" ghost>
        {
          database.table.map(table => {
            return (
              <Panel forceRender={true}
                showArrow={true}
                header={<Tag color="#87d068">{table.name}</Tag>}
                key={table.name}
              >
                <div key={table.name}>
                  <div>
                    {
                      table.fields.map(field => {
                        return (
                          <Form.Item
                            key={field.label}
                            {...field}
                            rules={[{ required: field.required, }]}
                          >
                            {field.type}
                          </Form.Item>
                        );
                      })
                    }
                  </div>
                </div>
              </Panel>
            );
          })
        }
      </Collapse>
    </>
  );
}

如props传入database是一个不存在的值时就会出现异常:在这里插入图片描述
增加可选链操作符后

const CardTableList = ({ database }) => {

  return (
    <>
      <Collapse defaultActiveKey={['loan_order', 'mv_run_result']} expandIconPosition="end" ghost>
        {
          database?.table.map(table => {
            return (
              <Panel forceRender={true}
                showArrow={true}
                header={<Tag color="#87d068">{table.name}</Tag>}
                key={table.name}
              >
                <div key={table.name}>
                  <div>
                    {
                      table?.fields.map(field => {
                        return (
                          <Form.Item
                            key={field.label}
                            {...field}
                            rules={[{ required: field.required, }]}
                          >
                            {field.type}
                          </Form.Item>
                        );
                      })
                    }
                  </div>
                </div>
              </Panel>
            );
          })
        }
      </Collapse>
    </>
  );
}

页面可以正常渲染
在这里插入图片描述

2. 空值合并运算符(??)

定义

空值合并运算符(??)是一个逻辑运算符,当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数。
与逻辑或运算符(||)不同,逻辑或运算符会在左侧操作数为假值时返回右侧操作数。也就是说,如果使用 || 来为某些变量设置默认值,可能会遇到意料之外的行为。比如为假值(例如,‘’ 或 0)时。见下面的例子。

语法

leftExpr ?? rightExpr

使用场景

// 对于函数入参进行默认值的处理
let jsonStr = value === undefined || value === null ? "" : value;

使用空值合并运算符可简化代码

let jsonStr = value ?? ""

3. webpack打包时用babel编译可选链运算符(?.)与空值合并运算符(??)

react单独引入时需要进行以下配置,如果新建react项目还是推荐cra等脚手架,免去繁琐的配置。
首先添加以下两个依赖:

npm install -D @babel/plugin-proposal-optional-chaining@7.12.7
npm install -D @babel/plugin-proposal-nullish-coalescing-operator@7.12.13

接着在babel编译配置文件(.babelrc)中添加配置:

{
  "presets": [
    "@babel/react"
  ],
  "plugins": [
  	...
    "@babel/plugin-proposal-optional-chaining",
    "@babel/plugin-proposal-nullish-coalescing-operator"
  ]
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/389198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript事件循环及任务处理

JavaScript事件循环及任务处理## 浏览器中 JavaScript 的执行流程和 Node.js 中的流程都是基于 事件循环 的。 理解事件循环的工作方式对于代码优化、性能优化很重要&#xff0c;有时对于正确的架构也很重要。 我们首先介绍事件循环工作方式的理论细节&#xff0c;然后介绍该知…

【数据库】MySQL数据库基础

目录 1.数据库&#xff1a; 2.数据库基本操作 2.1 MySQL的运行原理 2.2显示数据库&#xff1a; 2.3创建数据库 2.4使用数据库 2.5删除数据库 3.常见的数据类型 3.1数值类型&#xff1a; 3.2字符型类型 3.3日期类型 4.表的操作 4.1创建表 4.2查看表 4.3删除表 5.汇总…

【蓝桥杯PythonB组备赛】【Acwing周赛】第93场 4867. 整除数 4868. 数字替换 python解

目录 A AcWing 4867. 整除数 1.题目描述 2.思路分析 3.代码实现 B AcWing 4868. 数字替换 1.题目描述 2.思路分析 3.代码实现 A AcWing 4867. 整除数 1.题目描述 2.思路分析 为什么不能直接暴力&#xff1f; 数据&#xff1a;1 ≤ n, k ≤ 10 ** 9 1s内最多…

openpnp - 设备开机后, 吸嘴校验失败的解决方法

文章目录openpnp - 设备开机后, 吸嘴校验失败的解决方法概述重新校验吸嘴ENDopenpnp - 设备开机后, 吸嘴校验失败的解决方法 概述 设备开机后, 默认会校验吸嘴座上已经安装的2个吸嘴. 如果开机校验吸嘴失败, 就需要用向导重新校验失败的吸嘴. 具体是哪个吸嘴校验失败, 可以看…

C++的双端队列

双端队列介绍1.双端队列知识需知2.大试牛刀1.双端队列知识需知 由于队列是一种先进先出&#xff08;FIFO&#xff09;的数据结构&#xff0c;因此无法直接从队列的底部删除元素。如果希望从队列的底部删除元素&#xff0c;可以考虑使用双端队列&#xff08;deque&#xff09;。…

SpringCloud:Ribbon

目录 SpringCloud&#xff1a;Ribbon 1、负载均衡原理 2、负载均衡策略 3、饥饿加载 SpringCloud&#xff1a;Ribbon 1、负载均衡原理 2、负载均衡策略 Ribbon的负载均衡规则是一个叫做IRule的接口来定义的&#xff0c;每一个子接口都是一种规则; 内置负载均衡celue规则描…

2023年“网络安全”赛项江苏省淮安市选拔赛 任务书

任务书 一、竞赛时间 共计3小时。 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段单兵模式系统渗透测试 任务一 服务器内部信息获取 任务二 网站渗透测试 任务三 Linux系统渗透提权 任务四 Web渗透测试 第二阶段分组对抗 备战阶段 攻防对抗准备工作 系统加…

python+嵌入式——串口通信篇(收发解包)

目录前言安装pyserialpyserial大致概括整体流程硬件连接例子(简单版)详细使用serial初始化参数发包收包收包检查包并解包python struct模块结语前言 这几年&#xff0c;自己也做了一些嵌入式机器人。在整个开发的过程中&#xff0c;调通信通常会花费一段比较长的时间&#xff…

Docker是什么,怎么用?

1、docker解决了什么的问题&#xff1f; Docker是属于运维和持续集成的管理工具&#xff0c;特别是在运维方面使用Docker可以让你省去很多重复的工作&#xff0c;可以让你的应用程序永远都是在相同的环境中运行。 统一标准 ● 应用构建 ○ Java、C、JavaScript ○ 打成软件包 …

【刷题笔记】之二分查找(搜索插入位置。在排序数组中查找元素的第一个和最后一个位置、x的平方根、有效的完全平方数)

1. 二分查找题目链接 704. 二分查找 - 力扣&#xff08;LeetCode&#xff09;给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -…

《Linux运维实战:Mysql8.0.30安装及卸载component_validate_password插件》

一、背景 由于业务系统的特殊性&#xff0c;我们需要将MySQL8.0.30主从复制集群部署在客户机房服务器上&#xff0c;且客户对数据库的密码策略要求比较高。 因为官方的8.0.30版本的Docker镜像默认是没有安装validate_password插件的&#xff0c;所以我在主从复制集群安装完成后…

minGW-w64配置途径

文章目录1 GNU、GCC与minGW2 minGW当前下载方式3 minGW-w64配置途径Step1Step2Step31 GNU、GCC与minGW GNU这个名字是GNUs Not Unix的递归首字母缩写&#xff0c;它的发音为[gnoo]&#xff0c;只有一个音节&#xff0c;发音很像"grew"&#xff0c;但需要把其中的r音替…

aws apigateway 基础概念和入门示例

参考资料 https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/getting-started.html apigateway基础理解 apigateway的核心概念 apigateway&#xff0c;基础服务用来管理接口的创建&#xff0c;部署和管理restapi&#xff0c;http资源和方法的集合&#…

【LeetCode】1599. 经营摩天轮的最大利润

1599. 经营摩天轮的最大利润 题目描述 你正在经营一座摩天轮&#xff0c;该摩天轮共有 4 个座舱 &#xff0c;每个座舱 最多可以容纳 4 位游客 。你可以 逆时针 轮转座舱&#xff0c;但每次轮转都需要支付一定的运行成本 runningCost 。摩天轮每次轮转都恰好转动 1 / 4 周。 …

7 Seata简介

Seata-Server安装 分布式事务解决方案 2PC即两阶段提交协议&#xff0c;是将整个事务流程分为两个阶段&#xff0c;P是指准备阶段&#xff0c;C是指提交阶段。 1. 准备阶段&#xff08;Prepare phase&#xff09; 2. 提交阶段&#xff08;commit phase&#xff09;举例&…

模电基础(2)半导体二极管

1.二极管的组成二极管&#xff1a;将PN结封装起来&#xff0c;引出两个电极就构成了半导体二极管。二极管的常见结构包括&#xff1a;点接触型&#xff08;图a&#xff09;&#xff0c;面接触型&#xff08;图b&#xff09;&#xff0c;平面型&#xff08;图c&#xff09;。 点…

世界顶级五大女程序媛,不仅技术强还都是美女

文章目录1.计算机程序创始人&#xff1a;勒芙蕾丝伯爵夫人2.首位获得图灵奖的女性&#xff1a;法兰艾伦3.谷歌经典首页守护神&#xff1a;玛丽莎梅耶尔4.COBOL之母&#xff1a;葛丽丝穆雷霍普5.史上最强游戏程序媛-余国荔说起程序员的话&#xff0c;人们想到的都会是哪些理工科…

java基础-标识符命名规范和数据类型

标识符 1.什么是标识符&#xff1f; Java中变量、方法、类等要素命名时使用的字符序列&#xff0c;称为标识符。 技巧&#xff1a;凡是自己可以起名字的地方都叫标识符。比如&#xff1a;类名、方法名、变量名、包名、常量名等 2.标识符的命名规则 1.标识符由26个英文字母大小…

LQB手打,18B20读取温度,放大一百倍

https://blog.csdn.net/qq_45225613/article/details/110303632?ops_request_misc%257B%2522request%255Fid%2522%253A%2522167798888716800215065334%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id167798888716800215065334&biz_id0&a…

RCNN

1.RCNN 1.1算法流程 一张图像生成1k~2k个候选区域(使用Selective Search方法)对每个候选区域&#xff0c;使用深度网络提取特征特征送入每一类的SVM分类器&#xff0c;判断是否属于该类使用回归器精细修正候选框位置 1.候选区域的生成 利用selective Search算法通过图像分割的方…