JavaScript中的可选链——通过示例解释

JavaScript开发经常涉及导航嵌套对象,这可能很麻烦且容易出错,特别是在处理null或undefined值时。可选链是现代JavaScript语法中的一个改革性特性。

在本文中,我们将通过实际示例探讨可选链,演示它如何简化代码并使开发更加高效。

(本文内容参考:java567.com)

目录

  • 1、什么是可选链?
  • 2、如何访问嵌套属性
  • 3、如何调用嵌套方法
  • 4、动态属性访问
  • 5、结论

1、什么是可选链(?.)?

可选链是在ECMAScript 2020中引入的一项功能,它简化了在中间属性可能为null或undefined时访问嵌套对象或数组的属性和方法的过程。

可选链运算符(?.)允许您在不需要显式null或undefined检查的情况下访问属性或方法。如果链中的任何中间属性为null或undefined,则表达式会短路,并将结果设置为undefined。

在编程中,“短路”是指当沿着正在访问的属性或方法链遇到null或undefined值时,表达式的评估会立即停止的行为。与继续评估表达式不同,结果会立即设置为undefined,并跳过任何后续的属性或方法访问。

现在,让我们通过实际示例来了解可选链在现实场景中的工作原理。

2、如何访问嵌套属性

在这个例子中,我们有一个JavaScript对象,表示一个带有嵌套地址信息的用户。

const user = {name: "John",address: {city: "New York",zipcode: "10001"}
};

传统方法

访问用户地址中的城市属性的传统方式涉及多次检查以确保属性存在且不为null或undefined。

let city;
if (user && user.address && user.address.city) {city = user.address.city;
} else {city = "Unknown";
}console.log("传统方法:", city); // 输出: New York

此代码检查用户对象是否存在,是否具有地址属性,以及地址属性是否具有城市属性。如果其中任何条件失败,则将城市变量设置为“Unknown”。

可选链方法

使用可选链,访问嵌套城市属性变得简单得多:

const city = user?.address?.city || "Unknown";console.log("可选链方法:", city); // 输出: New York

?. 运算符用于访问用户地址的城市属性。如果链中的任何中间属性(用户或地址)为null或undefined,则表达式会短路,并将结果立即设置为“Unknown”。

3、如何调用嵌套方法

在这个例子中,我们有一个具有返回用户地址的方法getAddress()的用户对象。

const user = {name: "Alice",getAddress() {return {city: "San Francisco",zipcode: "94105"};}
};

传统方法

调用getAddress()方法并访问城市属性的传统方式涉及额外的检查,以确保方法存在并返回非null值。

let city;
if (user && user.getAddress) {const address = user.getAddress();if (address) {city = address.city;}
}console.log("传统方法:", city); // 输出: San Francisco

此代码首先检查用户对象是否存在,以及是否具有getAddress方法。然后调用该方法,并检查返回的地址对象是否存在,然后访问其城市属性。

可选链方法

使用可选链,可以更简洁地调用嵌套方法并访问城市属性:

const city = user?.getAddress?.().city || "Unknown";console.log("可选链方法:", city); // 输出: San Francisco

这里,可选链运算符用于调用getAddress()方法并访问其城市属性。如果getAddress方法或链中的任何中间属性为null或undefined,则表达式会短路,并将结果立即设置为“Unknown”。

4、动态属性访问

在这个例子中,我们有一个用户数组,每个用户可能有也可能没有个人资料。

const users = [{ id: 1, profile: { name: "Alice" } },{ id: 2 },{ id: 3, profile: { name: "Bob" } }
];

传统方法

动态访问个人资料名称的传统方式涉及对数组中的每个用户对象进行多次检查。

const names = users.map(user => {if (user && user.profile && user.profile.name) {return user.profile.name;} else {return "Unknown";}
});console.log("传统方法:", names); // 输出: ["Alice", "Unknown", "Bob"]

此代码使用map()遍历数组中的每个用户对象,并检查它是否具有具有名称属性的个人资料。如果名称属性存在,则返回它;否则,返回“Unknown”。

可选链方法

使用可选链,动态属性访问变得更加简单:

const names = users.map(user => user?.profile?.name || "Unknown");console.log("可选链方法:", names); // 输出: ["Alice", "Unknown", "Bob"]

这里,可选链运算符用于访问每个用户个人资料的名称属性。如果链中的任何中间属性为null或undefined,则表达式会短路,并将“Unknown”作为默认值返回。

5、结论

通过应用可选链,您可以简化代码,并使其更易读和可维护。

随着JavaScript的不断发展,像可选链这样的特性在提高开发人员的生产力和代码质量方面起着至关重要的作用。

(本文内容参考:java567.com)

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

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

相关文章

MySQL数据库基础(十三):关系型数据库三范式介绍

文章目录 关系型数据库三范式介绍 一、什么是三范式 二、数据冗余 三、范式的划分 四、一范式 五、二范式 六、三范式 七、总结 关系型数据库三范式介绍 一、什么是三范式 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库&…

代码随想录算法训练营第五十九天|

583. 两个字符串的删除操作 本题和动态规划:115.不同的子序列 相比,其实就是两个字符串都可以删除了,情况虽说复杂一些,但整体思路是不变的。 代码随想录 class Solution {public int minDistance(String word1, String word2) {…

流畅的Python(十一)-从协议到抽象基类

一、核心要义 主要讨论Python中的接口,所谓接口就是类实现或继承的一套公开(按照定义,受保护的属性和私有属性不在接口中)属性和方法,包括特殊方法,如__getitem__或__add__等。Python有两套规范接口的方式: 1. 鸭子类型和协议,这…

几种后端开发中常用的语言。

几种后端开发中常用的语言。 C/C 语言 C 语言最初是用于系统开发工作,特别是组成操作系统的程序。由于 C 语言所产生的代码运行速度与汇编语言编写的代码运行速度几乎一样,所以采用 C 语言作为系统开发语言。目前,C 语言是最广泛使用的系统…

MongoDB聚合运算符:$atan2

$atan2用来计算反正切&#xff0c;返回指定表达式的反正切值&#xff0c;与$antan的区别主要是参数不同。 语法 { $atan2: [<expression1>, <expression1>] }<expression>为可被解析为数值的表达式$atan2返回弧度&#xff0c;使用$radiansToDegrees运算符可…

数据结构与算法-常用排序算法

一、常用排序说明 当涉及排序算法时&#xff0c;理解每个算法的工作原理、时间复杂度和空间复杂度是至关重要的。下面对常用排序算法进行详细说明&#xff1a; 1、冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a; 工作原理&#xff1a;比较相邻的元素并交换&am…

python bug与debug

一、什么是bug&#xff08;软件缺陷&#xff09;&#xff1f; 产品说明书中规定要做的事情&#xff0c;而软件没有实现。 产品说明书中规定不要做的事情&#xff0c;而软件确实现了。 产品说明书中没有提到过的事情&#xff0c;而软件确实现了。 产品说明书中没有提到但是必…

跨语言的序列化与反序列化

在Java中实现跨语言的序列化与反序列化通常可以采用以下几种方式 使用标准的跨语言序列化格式 可以选择使用一些标准的跨语言序列化格式,例如JSON、XML、Protocol Buffers(ProtoBuf)等。这些格式都是跨语言的,可以方便地在不同的编程语言之间进行数据交换。在Java中,可以…

紫光同创初使用

芯片PGC2KG-6LPG144 1、安装好软件接&#xff0c;加载license,有两个&#xff0c;与电脑MAC地址绑定的 2、正常使用后&#xff0c;新建个工程&#xff0c;配置管脚Tools→UCE 3、程序中有些信号被软件认为是时钟信号&#xff0c;会报错&#xff08;时钟输入I0约束在非专用时钟…

LeetCode--代码详解 78.子集

78.子集 题目 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1…

Python爬虫-使用代理伪装IP

爬虫系列&#xff1a;http://t.csdnimg.cn/WfCSx 前言 我们在做爬虫的过程中经常会遇到这样的情况&#xff0c;最初爬虫正常运行&#xff0c;正常抓取数据&#xff0c;一切看起来都是那么的美好&#xff0c;然而一杯茶的功夫可能就会出现错误&#xff0c;比如 403 Forbidden&…

【LeetCode刷题笔记】242.有效的字母异位词

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…

Spring基础之AOP和代理模式

文章目录 理解AOPAOP的实现原理 AOP代理模式静态代理动态代理1-JDK动态代理2-CGLIB动态代理 总结 理解AOP OOP - - Object Oriented Programming 面向对象编程 AOP - - Aspect Oriented Programming 面向切面编程 AOP是Spring提供的关键特性之一。AOP即面向切面编程&#xff0…

Jenkins邮件通知配置(7)

1、安装插件&#xff1a; Email Extension&#xff0c;Email Extension Template&#xff0c;这两个插件可以帮助我们进行邮件的编写发送以及格式化 2、配置jenkins中链接腾讯企业邮箱 先配置发送服务&#xff0c;然后在具体工程中设置接收者 基础信息&#xff1a; POP3/S…

SWIFT:自我认知微调

文档:https://github.com/modelscope/swift/blob/main/docs/source/LLM/%E8%87%AA%E6%88%91%E8%AE%A4%E7%9F%A5%E5%BE%AE%E8%B0%83%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.md ​​​​​​代码: Swift是如何把自我认知数据集融合到训练集中呢? 1:相关的3个参数

设计模式学习笔记 - 面向对象 - 6.为什么要基于接口而非实现编程?有必要为每个类都定义接口吗?

前言 “基于接口而非实现编程”这个原则非常重要&#xff0c;是一种非常有效的提高代码质量的手段&#xff0c;在平时的开发中经常被用到。 如何解读原则中的“接口”二字 要理解“基于接口而非实现编程”的关键就是要理解其中的“接口”二字&#xff0c;我们可以理解为编程语…

学习数据节构和算法的第14天

题目讲解 链表的移除 #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct Node {int data; // 节点数据struct Node* next; // 指向下一个节点的指针 } Node; // 初始化链表节点 Node* initNode(int data) {Node* n…

mfc 疑难杂症之一

病情&#xff1a; 1.xxxx处的第一机会异常: 0xC0000005: 读取位置 0x00000004 时发生访问冲突。 2.不定时程序闪退 访问违例 程序定位到 main处 0x76DCB5B2 处(位于 Tetris.exe 中)引发的异常: Microsoft C 异常: CResourceException&#xff0c;位于内存位置 0x008FF0D4 处…

vue计算属性和监听器详解

1.watch 和 computed 的作用和区别 watch&#xff08;侦听器&#xff09; 作用&#xff1a; 监听器允许开发者自定义一个函数来观察 Vue 实例上的特定数据属性的变化&#xff0c;当这些属性发生变化时&#xff0c;会触发相应的回调函数。 特点&#xff1a; 非缓存&#xff1a…

用支持向量机进行光学符号识别

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…