优雅而高效的JavaScript——?? 运算符、?. 运算符和 ?. .运算符
🥴博主:小猫娃来啦
🥴文章核心:优雅而高效的JavaScript——?? 运算符、?. 运算符和 ?. 运算符
文章目录
- 引言
- 空值处理的挑战
- 解决方案1:?? 运算符
- 基本用法
- 与 || 运算符的区别
- 实际应用场景举例
- 解决方案2:?. 运算符
- 基本用法
- 与 . 运算符的区别
- 实际应用场景举例
- 解决方案3:?. 运算符的进一步简化:?..
- 基本用法
- 实际应用场景举例
- 总结
引言
JavaScript作为一种广泛使用的脚本语言,不断演进发展。ECMAScript 2020(ES2020)标准引入了三个新的语法特性:?? 运算符、?. 运算符和 ?. 运算符,用于简化代码编和处理可能的空值情况。我们会通过本篇博客深入分析这些新的语法特性,并通过举例和代码演示来解释它们的用法和实际应用场景。
空值处理的挑战
在编程中,经常会遇到处理可能为空的值的情况,例如在访问对象属性或调用函数时。在传统的JavaScript中,我们通常使用长短路运算符(如)或条件语句(如if-else)来处理空值情况。然而,这些方法在编写代码时会显得冗长,可读性较差,并且容易出错。为了解决这个问题,ES2020引入了新的语法特性。
解决方案1:?? 运算符
基本用法
?? 运算符(空值合并运算符)可以用来判断一个值是否为null或undefined,并提供一个默认值。其语法为:value1 ?? value2
,如果value1是null或undefined,则返回value2;否则返回value1的值。
下面是一个示例代码:
const x = null;
const y = 10;
const result = x ?? y;console.log(result); // 输出 10
在这个例子中,由于x是null,以返回了y的值。
与 || 运算符的区别
?? 运算符与 || 运算符类似,但它们有一些重要的区别。|| 运算符只能判断一个值是否为 “false”(例如:null、undefined、false、0、‘’),而 ?? 运算符能够精确地判断一个值是否为null或undefined。
下面是一个对比例子:
const x = 0;
const y = 10;
const result1 = x || y; // 使用 || 运算符
const result2 = x ?? y; // 使用 ?? 运算符console.log(result1); // 输出 10
console.log(result2); // 输出 0
在这个例子中,由于x的值为0,它被判定为 “falsy” 值,所以使用 || 运算符时返回了y的值,而使用 ?? 运算符时返回了的值。
实际应用场景举例
- 表单输入默认值
const username = getInputValue('username') ?? '加菲猫';
在这个例子中,如果getInputValue(‘username’)返回的值为null或undefined,则username会被设置为加菲猫作为默认值。
- 函数参数默认值
function greet(name) {name = ?? '加菲猫';console.log(`Hello, ${name}`);
}
在这个例子中,如果没有传入name参数或传入的值为null或undefined,则name会被设置为加菲猫作为默认值。
解决方案2:?. 运算符
基本用法
?. 运算符(可选链运算符)可以简化对可能为null或undefined的值进行属性访问或方法调用的代码。其语法为:object?.property
或 object?.method()
。
下面是一个示例代码:
const obj {foo: {bar: '咕咕'}
};const result = obj?.foo?.;console.log(result); // 输出 "咕咕"
在这个例子中,由于obj.foo.bar存在,所以返回了其值"咕咕"。
与 . 运算符的区别
?运算符与.运算符类似,但它们之间有一些关键的区别。如果对象的某个属性或方法不存在,. 运算符会抛出一个TypeError,而?. 运算符会返回undefined,不会导致程序崩溃。
下面是一个对比例子:
const obj = {foo: null
};const result1 = obj.foo.bar; // 使用 . 运算符
const result2 = obj?.foo?.bar; // 使用 ?. 运算符console.log(result1); // TypeError: Cannot read property 'bar' of null
console.log(result2); // 输出 undefined
在这个例子中,虽然obj.foo存在,但它的值为null,所以使用. 运算符对bar进行访问抛出TypeError,而使用?. 运算符时返回了undefined。
实际应用场景举例
- 链式对象访问
const user = {name: '加菲猫',address: {street: '东大街',city: '陕西'}
};const city = user.address?.city;
在这个例子中,如果user.address存在,则city被为其值;否则city将为undefined。
- 安全地调用函数
const handler = obj?.method?.();
在这个例子中,如果obj.method存在,则会调用它并将返回值赋给handler变量;否则handler将为undefined。
解决方案3:?. 运算符的进一步简化:?..
基本用法
?. 运算符的进一步简形式是?.. 通过将两个运算符组合在一起,可以更加简洁地处理链式对象访问或函数调用的情况。其语法:object?.property
或 object?..method()
。
下面是一个示例代码:
const user = {name: 'John',address: {street: '东大街',city: '陕西'}
};const city = user?..address?.city;console(city); // 输出 "陕西"
在这个例子中,由于user.address.city存在,所以返回了其值"New York"。
实际应用场景举例
- 链式对象访问
const user {name: '加菲猫',address: {street: '东大街',city: '陕西'}
};const city = user?..address.city;
在这个例子中,如果user存在且address存在,则city被设置为其值;否则city将为undefined。
- 安全地调用函数
const handler = obj?..method();
在这个例子中,如果obj存在且method存在,则会调用它并将返回值赋给handler变量;否则handler将为undefined。
总结
本文通过对新的JavaScript语法特性??运算符、?.运算符和?..运算符进行深度横向纵向分析,分别介绍了它们的基本用法、与其他运算符的区别以及实际应用场景。这些新的语法特性在处理可能的空值情况时能够大大简化代码,并提高代码的可读性和健壮性。在日常的JavaScript开发中,合理使用这些语法特性将有助于提高开发效率和代码质量。
相关文章:

优雅而高效的JavaScript——?? 运算符、?. 运算符和 ?. .运算符
🥴博主:小猫娃来啦 🥴文章核心:优雅而高效的JavaScript——?? 运算符、?. 运算符和 ?. 运算符 文章目录 引言空值处理的挑战解决方案1:?? 运算符基本用法与 || 运算符的区别实际应用场景举例 解决方案2ÿ…...

【数之道 08】走进“卷积神经网络“,了解图像识别背后的原理
卷积神经网络 CNN模型的架构Cnn 的流程第一步 提取图片特征提取特征的计算规则 第二步 最大池化第三步 扁平化处理第四步 数据条录入全连接隐藏层 b站视频 CNN模型的架构 图片由像素点组成,最终成像效果由背后像素的颜色数值所决定的 有这样的一个66的区域&#x…...

Stm32_标准库_期末设计_温度测量光照测量手机与芯片通信实现信息的更新
目录 前言:1.接线&效果&功能:2. 实现:1、手机与芯片单向通信:(1) 确保接收数据的完整性:(2) 判断传输数据的合法性:(3) 对数据合理的分割整合:(4) 实现过程产生的重大BUG及解决方法: 2、时间&日…...
JavaScript 的类型和值
JavaScript 的类型和值 1. 类型 1.1 七种内置类型 空值(null)未定义(undefined)布尔值(boolean)字符串(string)数字(number)对象(object)符号&…...

Kotlin Compose Multiplatform 跨平台开发实践之加入 iOS 支持
前言 几个月前 Compose Multiplatform 的 iOS 支持就宣布进入了 Alpha 阶段,这意味着它已经具备了一定的可用性。 在它发布 Alpha 的时候,我就第一时间尝鲜,但是只是浅尝辄止,没有做过多的探索,最近恰好有点时间&…...

【小黑嵌入式系统第四课】嵌入式系统硬件平台(二)——I/O设备、通信设备(UARTUSB蓝牙)、其他(电源时钟复位中断)
上一课: 【小黑嵌入式系统第三课】嵌入式系统硬件平台(一)——概述、总线、存储设备(RAM&ROM&FLASH) 文章目录 一、I/O设备1. 定时器/计数器2. ADC和DAC3. 人机接口设备3.1 键盘3.2 LCD显示器3.3 触摸屏 二、通信设备1. 通…...

报错:AttributeError: module ‘tensorflow‘ has no attribute ‘flags‘
改成如下: 报错原因:tensorflow1.x与2.x版本问题不兼容...

Android--Retrofit2执行多个请求任务并行,任务结束后执行统一输出结果
场景:后端上传文件接口只支持单个文件上传,而业务需求一次性上传多个图片,因此需要多个上传任务并发进行,拿到所有的返回结果后,才能进行下一个流程。 1、使用Java并发工具 private List<Response<JSONObject>…...
面试算法30:插入、删除和随机访问都是O(1)的容器
题目 设计一个数据结构,使如下3个操作的时间复杂度都是O(1)。 insert(value):如果数据集中不包含一个数值,则把它添加到数据集中。remove(value):如果数据集…...

Qt/C++开源作品45-CPU内存显示控件/和任务管理器一致
一、前言 在很多软件上,会在某个部位显示一个部件,专门显示当前的CPU使用率以及内存占用,方便用户判断当前程序或者当前环境中是否还有剩余的CPU和内存留给程序使用,在不用打开任务管理器或者资源查看器的时候直接得知当前系统的…...

win32汇编-使用子程序
当程序中相同功能的一段代码用得比较频繁时,可以将它分离出来写成一个子程序,在主程序中用call指令来调用它。这样可以不用重复写相同的代码, 仅仅用call指令就可以完成多次同样的工作了。Win 32汇编中的子程序也采用堆栈来传递参数ÿ…...

【论文阅读】 Cola-Dif; An explainable task-specific synthesis network
文章目录 CoLa-Diff: Conditional Latent Diffusion Model for Multi-modal MRI SynthesisAn Explainable Deep Framework: Towards Task-Specific Fusion for Multi-to-One MRI Synthesis CoLa-Diff: Conditional Latent Diffusion Model for Multi-modal MRI Synthesis 论文…...

ShareMouse for Mac(多台电脑鼠标键盘共享软件)
ShareMouse mac版是一款Mac平台上可以在多台电脑间共享鼠标的工具软件,sharemousefor Mac支持 Windows 与 Mac,并可以在不同电脑间共享剪贴板。只需要移动鼠标指针的到想控制的显示器那里去、鼠标光标就会神奇地“跨越”到邻近的电脑屏幕上。每个计算机都…...

中文编程开发语言工具开发案例:多种称重方式编程实际例子
中文编程开发语言工具开发案例:多种称重方式编程实际例子 上图为 计价秤,使用串口通讯线连接电脑的主机,软件自动读取称的重量,自动计算金额。这种方式称重快速,不需再打印条码。 上图这个称重方式为 一体称称重&#…...
国密sm2的Vue、Python、Java互通使用
目录 一、Vue 二、Python 三、Java 一、Vue # npm install --save sm-cryptoimport {sm2} from sm-crypto const cipherMode 1 const private_key d9d37f4f46e8514c6f9398a984e74f3eead994e8f4ac5f92e5deb313cb5ad6a6 const public_key 04 e332ee43ac37be458550652fb9…...

如何通过SK集成chatGPT实现DotNet项目工程化?
智能助手服务 以下案例将讲解如何实现天气插件 当前文档对应src/assistant/Chat.SemanticServer项目 首先我们介绍一下Chat.SemanticServer的技术架构 SemanticKernel 是什么? Semantic Kernel是一个SDK,它将OpenAI、Azure OpenAI和Hugging Face等大…...
DRM中render-node编号的分配
DRM系统 DRM是direct rendering manager的简称。DRM是linux kernel中与负责video cards功能的GPU打交道的子系统。DRM给出了一组API,可以供用户程序来发送命令和数据给GPU设备从而来控制比如display、render等功能。 render-node由来 在以前,DRM子系统…...

将输入对象转换为数组数组的维度大于等于1numpy.atleast_1d()
【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将输入对象转换为数组 数组的维度大于等于1 numpy.atleast_1d() 选择题 使用numpy.atleast_1d()函数,下列正确的是? import numpy as np a1 1 a2 ((1,2,3),(4,5,6)) print("…...
js 删除树状图无用数据,如果子级没有数据则删除
有一个需求,当你从后端拿到一个树状图的时候,有些子级没数据,这时就需要我们处理一下数据,当然了,如果第一层底下的第二层没数据,第二层底下的所有都没数据,那这一层都不需要。 我的写法&#x…...

Docker 容器化(初学者的分享)
目录 一、什么是docker 二、docker的缺陷 三、简单的操作 一、首先配置一台虚拟机 二、安装Docker-CE 一、安装utils 二、 将 Docker 的软件源添加到 CentOS 的 yum 仓库中。这样可以通过 yum 命令来安装、更新和管理 Docker 相关的软件包。 三、将 download.docker.co…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...