优雅而高效的JavaScript——?? 运算符、?. 运算符和 ?. .运算符

news2024/11/18 16:54:28

在这里插入图片描述
🥴博主:小猫娃来啦
🥴文章核心:优雅而高效的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?.propertyobject?.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?.propertyobject?..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开发中,合理使用这些语法特性将有助于提高开发效率和代码质量。
在这里插入图片描述


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

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

相关文章

fastadmin如何让后台的日期显示成年月日格式

fastadmin的后台时间戳字段如何显示成年月日的日期格式,网上有很多同仁也在问这个问题,下面我把我这摸索到的方法给大家分享一下: 解决方法: 找到public\asset\js\backend\控制器.js 增加formatter: Table.api.formatter.datetim…

基于stm32f103c8t6的串口中断蓝牙通讯

这一篇文章与 上一篇文章相基于 stm32f103c8t6的串口非中断蓝牙通讯上一篇文章相http://t.csdnimg.cn/7j0Ec 相比,硬件部分是相同的。在原有的旧初上,要在stm32cube加入中断,同时代码中也要引入中断函数以及中断回调函数。到后面我谁说说我…

免费的国产数据集成平台推荐

在如今的数字化时代下,企业内部的数据无疑是重要资产之一。随着数据源的多样性和数量剧增,如何有效地收集、整合、存储、管理和分析数据变得至关重要。为了解决这些常见痛点,数据集成平台成为了现代企业不可或缺的一部分。 数据集成是现代数…

腾讯云双11服务器优惠活动价格表预热!

2023腾讯云双十一优惠活动服务器特价多配置报价2核2G3M、2核2G4M、2核4G5M、2核4G5M、4核8G12M、8核16G18M和16核32G28M,目前腾讯云双11价格还没出来,阿腾云根据目前2核2G3M配置95元一年预测双11价格可能是88元一年,整理大概有个10%的优惠幅度…

原型设计工具:Balsamiq Wireframes 4.7.4 Crack

原型设计工具:Balsamiq Wireframes是一种快速的低保真UI 线框图工具,可重现在记事本或白板上绘制草图但使用计算机的体验。 它确实迫使您专注于结构和内容,避免在此过程后期对颜色和细节进行冗长的讨论。 线框速度很快:您将产生更多想法&am…

Android笔记(七)Android JetPack Compose组件搭建Scaffold脚手架

在去年2022年曾发布一篇关于脚手架的文章:“Android JetPack Compose组件中Scaffold的应用” 。但是Android的版本从12变更到13及以上版本,导致一些细节的实现存在不同。在本文中,将从头开始介绍整个脚手架的搭建过程。 一、新建项目模块 在…

uniGUI文件操作

一.文件上传TUniFileUploadButton TUniFileUploadButton主要属性: Filter: 文件类型过滤,有图片image/* audio/* video/*三种过滤 MaxAllowedSize: 设置文件最大上传尺寸; Message:标题以及消息文本,可翻译成中文…

手写call(),apply(),bind()方法

目录 知识储备: 一:手写call方法 1、思路 2、实现 3、Symbol调优 二:手写apply方法 1、思路 2、实现 三:手写bind方法 1、思路 2、实现 四:总结 知识储备: 所有的方法都可以调用我们手写的方法&…

npm ERR! node-sass@6.0.1 postinstall: `node scripts/build.js`

1.遇到的问题 vue npm install提示以下错误 2.首次尝试方法 尝试用下面的方式重新安装弄得-saas,结果不起作用 。 npm config set sass_binary_sitehttps://npm.taobao.org/mirrors/node-sass npm install node-sass 这时考虑降级node版本,node.js从…

上海亚商投顾:沪指再创年内新低 贵州茅台等权重股集体调整

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 三大指数昨日全线调整,沪指逼近3000点大关,深成指、创业板指续创年内新低。芯片板块逆…

推荐系统(RS)

主流推荐算法 协同过滤算法 协同过滤算法的原理 根据用户群体对产品偏好的数据,发现用户之间的相似性或者物品之间的相似性,并基于这些相似性为用户作推荐。 基于用户的协同过滤算法(User-based Collaborative Filtering) 其本…

Leetcode刷题详解——四数之和

1. 题目链接:四数之和 2. 题目描述: 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应&#xff0…

『力扣刷题本』:相交链表

咳咳,实在抱歉,刚开始心气太高了,叫『每日一题』,我是真的坚持不下了。 经过这次打击,我算是摸明白自己在写博客这件事情上几斤几两了,现在预计一周两更,再慢慢把更新频率提上来。 正在努力补…

python写的自动按键和鼠标连点

自己用python写的自动按键和鼠标自动点击。 分享一下源码,比较干净的,缺点就是是python打包有点大50多M from PyQt5 import QtWidgets, uic, QtCore from pynput import keyboard, mouse import pygetwindow as gw from PyQt5.QtGui import QPainter, Q…

YOLOv7改进实战 | 更换轻量化主干网络Backbone(一)之Ghostnet

前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…

Netty常用类与接口

netty架构图 ServerBootstrap 、 Bootstrap ServerBootstrap :服务器的引导类,可以绑定服务器和端口,配置 Channel、ChannelHandler等。 Bootstrap:客户端的引导类。可以开启客户端,连接服务端的端口,配置…

矩阵系统功能介绍

数据大屏:监测读取后台数据 AI素材库:一键去水印功能 将视频做出自己的 AI智能文案:一键生成各种文案,解决文案编写困难的问题 视频剪辑:一键剪辑多个视频

vue3引入全局js

main.js中引入js,设置全局属性 m a p : a p p . c o n f i g . g l o b a l P r o p e r t i e s . map:app.config.globalProperties. map:app.config.globalProperties.map引入js对象 vue页面中使用。引入vue实例: import {getCurrentInstance} from “…

VS2022更换背景壁纸逐步图示教程

🦄个人主页:修修修也 ⚙️操作环境:Visual Studio 2022 目录 一.下载壁纸插件 二.更改自定义壁纸 三.调整壁纸布局 一.下载壁纸插件 因为更改自定义壁纸需要一个插件的辅助,所以我们要先下载一个小插件 首先,打开VS2022,点击"扩展"->"管理扩…

无人机电力巡检:国网安徽实际案例解析

在科技快速发展的今天,传统行业正在经历前所未有的转型。电力巡检,这一看似传统且乏味的任务,却因为无人机技术的介入而焕发新生。今天,让我们深入了解一个具体的案例,探索无人机如何革新电力巡检。 案例背景&#xff…