ES6中Null判断运算符(??)正确打开方式-

2023-11-18

读取对象属性的时候,如果某个属性的值是null或者undefined,有时候需要为它们指定默认值。常见的作法是通过||运算符指定默认值。

const headerText = response.settings.headerText || 'Hello, world!';
const animationDuration = response.settings.animationDuration || 300;
const showSplashScreen = response.settings.showSplashScreen || true;

上面的三行代码都是通过||运算符指定默认值,但是这样写是错的。我们这样写的意愿一般是,只要属性的值为null或者undefined,默认值就会生效。但是属性的值如果是空字符串或者false或者0,默认值也会生效

为了避免这种情况,ES2020引入了一个新的Null判断运算符??。它的行为类似于||,但是只有运算符左侧的值为null或者undefined时,才会返回右侧的值。

const headerText = response.settings.headerText ?? 'Hello, world!';
const animationDuration = response.settings.animationDuration ?? 300;
const showSplashScreen = response.settings.showSplashScreen ?? true;

上面代码中,默认值只有左侧属性值为null或者undefined时,才会生效

这个运算符的一个目的,就是跟链判断符?.配合使用,为null或者undefined的值设置默认值

const value = respons.setting?.value ?? 300

上面的代码中,如果response.setting时null或者undefined,或者response.setting.value是null或者undefined,就会返回默认值300。也就是说,这一行代码包括了两级属性的判断

这个运算符很适合判断函数参数使得否赋值

function Component(props){
    const enabled = props.enabled ?? true
    // ...
}

上面的代码判断props参数enabled属性是否赋值,基本等同于下面的写法

function Component(props){
    const { enabled:enable=true} = props
    // ....
}

?? 本质上是逻辑运算,它与其他两个逻辑运算符&&和||有一个优先级问题,它们之间的优先级到底谁高谁低。优先级的不同,往往会导致逻辑运算结果不同。

现在的规则是,如果多个运算符一起使用,必须用括号表明优先级,否则会报错

// 报错
lhs && middle ?? rhs
lhs ?? middle && rhs
lhs || middle ?? rhs
lhs ?? middle || rhs

上面四个表达式都会报错,必须加入标明优先级的括号

(lhs && middle) ?? rhs;
lhs && (middle ?? rhs);

(lhs ?? middle) && rhs;
lhs ?? (middle && rhs);

(lhs || middle) ?? rhs;
lhs || (middle ?? rhs);

(lhs ?? middle) || rhs;
lhs ?? (middle || rhs);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ES6中Null判断运算符(??)正确打开方式- 的相关文章

  • D3.js分组条形图

    I am making a bar chart using D3 js like this source statcan gc ca http www statcan gc ca pub 12 593 x 2007001 figures f
  • OpenLayers:放大或缩小后,被破坏的特征会重新出现

    我有一个 OpenLayers Bing 地图应用程序 可以显示危险废物站点 用户可以单击链接来切换地图上站点的子站点 当我通过调用层上的 destroyFeatures 来关闭子站点 它们是向量层上的点 时 它们会按预期消失 但是 如果我
  • 如何从 JavaScript 触发 ASP.NET Core 客户端验证

    有没有办法从 JavaScript 触发 ASP NET Core 客户端验证 我有一个 Razor Pages 页面 其中包含
  • 如何使用 LeafLe 创建商店地图

    我希望创建一个可以交互的地图 我发现的最好的选择是传单 问题是我没有找到任何资源来解释如何创建自己的地图 我希望创建一个商场地图 用户可以在其中看到所有商店 喷泉 我怎样才能做到这一点 最好的起点是传单示例页面 http leafletjs
  • 开始使用 Three.js 中的行进立方体

    我是 Three js 的新手 正在寻找教程来帮助我开始了解如何在 Three js 中使用 Marching Cubes 到目前为止 我在 Three js 中看到的一些使用它的项目对我来说有点复杂 所以一个简单的教程会很好 谢谢 像您一
  • 在 JavaScript 中引用 C# 变量

    我已经阅读了很多线程 但我不明白为什么这不起作用 我正在创建一个将用作导航栏的 SharePoint Web 部件 一切都很顺利 直到我尝试在 JS 代码中引用 C 变量 这是来自 VisualWebPart1UserControl asc
  • JSLint 错误:意外的“这个”

    无法理解为什么 JSLint 对我的使用感到惊讶this在下面的代码中 function testConstr x use strict this joker Whyyy sooo seriousss this x x 对于这两个属性分配
  • 是否可以向 JavaScript 函数发送可变数量的参数?

    是否可以从数组向 JavaScript 函数发送可变数量的参数 var arr a b c var func function debug alert arguments length for arg in arguments alert
  • 在 Typescript 中从基类创建子类的新实例[重复]

    这个问题在这里已经有答案了 我想创建新实例Child班级来自Base类方法 这有点复杂 但我会尽力解释 这是一个例子 class Base constructor clone Here i want to create new instan
  • 未捕获的安全错误:阻止了具有原点的框架...访问具有原点的框架

    我已经为 SAP 解决方案 无论什么 制作了一个组件 该组件通过 iframe 嵌入到报告中 在 SAP 平台 BO 上部署报告后 我收到此错误 在 Chrome 上 但在 IE 或 FF 上也不起作用 Uncaught SecurityE
  • 如何像在浏览器中一样检索准确的 HTML

    我正在使用 Python 脚本来呈现网页并检索其 HTML 它适用于大多数页面 但对于其中一些页面 检索到的 HTML 不完整 我不太明白为什么 这是我用来废弃此页面的脚本 由于某种原因 每个产品的链接不在 HTML 中 Link http
  • 什么是闭包编译器?

    如果您不知道我在说什么 请查看以下内容 http closure compiler appspot com home http closure compiler appspot com home 这是一个 JavaScript 压缩器 在他
  • 使用 Google 地图 API 进行反向地理编码

    我正在研究 JavaScript Google Map API 版本 3 更准确地说 正在研究反向地理定位 在 的帮助下官方文档 http code google com intl fr apis maps documentation ge
  • 如何制作实时jquery效果?

    我想制作一个实时提要阅读器 并且我想要一个解决方案 使新项目无需刷新页面即可出现 并且具有像friendfeed一样的滚动效果 你可以在这里看到我在说什么 http www vimeo com 4029954 http www vimeo
  • 将罗马数字转换为阿拉伯数字--recursiv

    我是 JavaScript 新手 正在网站的帮助下学习https www jshero net koans roman1 html https www jshero net koans roman1 html 本练习是编写一个转换器 将罗马
  • Apollo 客户端“未找到命名导出‘删除’”

    我正在尝试创建一个apollo client插件Nuxt 3应用 它当前抛出有关名为的包的错误ts invariant file Users my name Repositories project node modules apollo
  • 如何缩放到高图中的特定点

    Highmaps highcharts 是一个 javascript jquery 适配器 可在浏览器等中呈现地图 我有一张突出显示单个国家 地区的地图 但是 世界 地图的比例如此之大 因此我想在将地图加载到相关国家 地区后进行放大 看看
  • Escape String - 在 Javascript 中输出rails字符串[重复]

    这个问题在这里已经有答案了 我正在尝试将字符串值分配给 erb 文件中的 javascript 对象 如下所示 var data name 问题是 如果name is Tom s small ears 的输出data name将会Tom x
  • 有没有用 Javascript 编写的开源 JSDoc 解析器?

    我正在寻找一个可以在我的项目中使用的 JSDoc 解析器 我正在寻找可以传递 JSDoc 注释并接收该注释含义的结构化描述的东西 我见过的大多数工具似乎都能够将 JSDoc 注释转换为 HTML 或其他格式 我正在寻找能够提供可用于输入其他
  • ESLint 如何集成到 Create React App 中?

    当我跑步时npx create react app some name 为我创建了一个简单的 React 项目 当我随后窥视package json 似乎有一些 ESLint 存在的证据 因为有 eslintConfig extends r

随机推荐

  • Array.splice()--删除数组中重复的数据

    Array splice 删除数组中重复的数据 splice方法从一个数组中移除一个或多个元素 如果必要 在所移除元素的位置上插入新元素 返回所移除的元素 用法 my array splice start deleteCount value
  • Seata1.4.2+Nacos搭建使用

    Seata1 4 2 Nacos搭建使用 前言 一 搭建seata1 4 2服务端 1 下载seata1 4 2 2 创建相关数据库和表 3 配置Seata 1 4 2 4 启动seata1 4 2 二 客户端使用seata1 4 2 1
  • 蓝桥杯题目练习(星际交流)

    算法训练VIP 星际交流 原题链接 星际交流 题目描述 人类终于登上了火星的土地并且见到了神秘的火 星人 人类和火星人都无法理解对方的语言 但是我们的科学家发明了一种用数字交流的方法 这种交流方法是这样 的 首先 火星人把一个非常大的数字告
  • 深度CV基础——图像噪声和滤波

    一 图像噪声 1 图像噪声的概念 图像噪声是图像在获取或是传输过程中受到随机信号干扰 妨碍人们对图像理解及分析处理的信号 很多时候将图像噪声看做多维随机过程 因而描述噪声的方法完全可以借用随机过程的描述 也就是使用随机过程的描述 也就是用它
  • SQL Server 修改字段属性信息报错

    当表创建好以后再次修改表信息保存会出现 选择Tools gt Options 选中勾掉点OK就可以了
  • docker-compose单机容器编排的神器

    docker compose和docker兼容表 简介 docker所制作的容器多半需要大量的依赖 有些可能依赖于其他容器的启动 比方说一个springboot的项目 它需要rabbitMQ和esearch什么的 有些没装数据库的机器需要m
  • STM32 GPIO的基础实现

    什么是GPIO GPIO 英文全称 general porpose intput output 即 通用输入输出端口 顾名思义 芯片最基本的输入输出接口 STM32或其它单片机芯片的GPIO引脚可以与外部设备连接起来 可以实现与外部设备通讯
  • Spring系列之@Value【用法、数据来源、动态刷新】

    面试官 Spring中的 Value用过么 介绍一下 我 Value可以标注在字段上面 可以将外部配置文件中的数据 比如可以将数据库的一些配置信息放在配置文件中 然后通过 Value的方式将其注入到bean的一些字段中 面试官 那就是说 V
  • 关于DYNPRO程序的系统迁移与版本不匹配问题之一

    前段时间公司做的一个项目 这两天在将项目程序导入公司 出问题了 搞了半天才发现是系统版本问题 但是还是不知道怎么解决 纠结ING DYNRPO程序在创建 或是首次运行 的时候会自动生成一个DYNRPO组件程序的类 这个程序是后台解析DYNP
  • 优惠券秒杀(一)

    L1296686146 冗谪 2023 07 20 08 18 发表于陕西 收录于合集 redis7个 优惠券秒杀 数据表 优惠券的表 优惠券的基本信息 优惠金额 使用规则等 CREATE TABLE tb voucher id bigin
  • RESTful API介绍

    1 什么是RESTful API 一种流行的API设计风格 2 为什么使用RESTful架构 REST 是 Representational State Transfer 的缩写 如果一个架构符合 REST 原则 就称它为 RESTful
  • 服务器老是提示内存不足

    jps mlvV 查进程 jmap heap 进程ID 查看内存是多少 JAVA OPTS Xms1536m Xmx1536m XX PermSize 512m XX MaxPermSize 512m
  • 【python】numpy.percentile()函数

    numpy percentile 1 函数 百分位数是统计中使用的度量 表示小于这个值的观察值的百分比 函数numpy percentile 接受以下参数 np percentile a q axis None out None overw
  • android布局矩形只显示一条底线,android – 在布局的绝对中心显示一个矩形框

    您可以使用重量使用线性布局进行调整 我已经粘贴了一个示例代码 希望这会有所帮助 android layout width fill parent android layout height fill parent android orien
  • 【Linux】遍历文件夹

    include
  • 关于图像模式识别的几种分类方法概述

    1 基于概率统计的Bayes分类器 因为在实际分类中由于考虑的侧重点不同或者关心的点不一样导致不能使用同一决策去解决所有的事件的分类 所以需要根据不同的准测函数选择不同的分类决策 基于最小错误率的Bayes决策 基于最小风险的Bayes决策
  • mybatis 分页_Mybatis 分页查询方法

    Mybatis自带的两种分页方法 Mybatis有两种自带分页方法 RowBounds和PageHelper 其中前者是逻辑分页 后者是物理分页 本文后续假设使用myabtis generator生成mapper RowBounds Row
  • 二阶段无法解决的问题

    二阶段无法解决的问题 协调者再发出commit消息之后宕机 而唯一接收到这条消息的参与者同时也宕机了 那么即使协调者通过选举协议产生了新的协调者 这条事务的状态也是不确定的 没人知道事务是否被已经提交 与两阶段提交不同的是 三阶段提交有两个
  • python - 快速搜索指定格式文件的方法

    需求1 快速查找指定文件夹下 所有满足开头为NC 结尾为 nc的文件 root path Users xpji convert kuihua9data 20230621 from pathlib import Path def get fi
  • ES6中Null判断运算符(??)正确打开方式-

    读取对象属性的时候 如果某个属性的值是null或者undefined 有时候需要为它们指定默认值 常见的作法是通过 运算符指定默认值 const headerText response settings headerText Hello w