JavaScript 如何优雅地获取多层级response中的某个深层次字段 ?. 可选链条(Optional chaining)

news2025/7/20 21:05:09

文章目录

    • 一句话
    • 场景:从一个多层级对象中拿一个处在深层次位置的字段
    • MDN 可选链
    • 搜索引擎使用

一句话


var marriedFlag = response.data.userList[0].married;		// 如果中间某个对象为空,会报Error


var marriedFlag = response?.data?.userList[0]?.married;// 如果中间某个对象为空,只是最终表达式的值为 undefined ,而不是报错。

场景:从一个多层级对象中拿一个处在深层次位置的字段

现在我是一个前端开发,我在调用一个后端API,它的response长下面这样:

{
  errorCode: null,
  errorDesc: null,
  data: {
  	userList: [
			{
				name: "wuyujin",
				age: 22,
				married: true
			}
    ]
  }
}

我需要拿到其中的married信息在前端做渲染:

var response = fetch...	// 发送HTTP请求,拿到response

var marriedFlag = response.data.userList[0].married;
var text = marriedFlag ? "已婚" : "未婚";

我的代码是没问题的。
可是突然有一天,后端给我的response里缺了一段东西,变成这样:

{
  errorCode: null,
  errorDesc: null,
  data: null
}

我的代码就会报错:response.data.userList[0].married;response.data为null,用null去调用一个成员,报错:
在这里插入图片描述
那我就改前端代码:

var response = fetch...	// 发送HTTP请求,拿到response

if (response !== undefined && response.data !== undefined && response.data.userList != undefined ...) {
	var marriedFlag = response.data.userList[0].married;
	var text = marriedFlag ? "已婚" : "未婚";
}

好麻烦啊。

直到有一天我看到?操作符。

MDN 可选链

MDN Optional chaining (?.)

同样的响应数据的提取需求,代码可以改为以下:

var response = fetch...	// 发送HTTP请求,拿到response

// var marriedFlag = response.data.userList[0].married;
var marriedFlag = response?.data?.userList[0]?.married;
var text = marriedFlag ? "已婚" : "未婚";

在对象调用链中将.变成?.,可以避免因某一步对象实际为null/undefined而导致报处Error
用了?.之后,如果中间某一层对象为空,只是这整条语句的返回值为undefined而已,不会报错!

在这里插入图片描述
本语法细节的浏览器兼容性:

在这里插入图片描述

搜索引擎使用

我在刚刚看到这个写法的时候,马上就学会了其用法,只是一直不知道官方把它叫啥名,去baidu/bing/google/SOF搜索javascript ?. 想了解更多信息一无所获。

直到有一天,我开始尝试以下关键字:
javascript 问号 点
javascript question dot
终于有了结果。

我想说的是:当我们想在搜索引擎搜索的东西本身就是特殊字符的时候,需要转换一下思路,改一改搜索方式

?. 这对后端来说,是特殊符号,不好处理。
也许你正在调用的搜索接口里,压根没把这些特殊字符当作搜索关键字去处理。

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

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

相关文章

外贸新手找客户的开发信修炼之旅(一)

开发信是一种传统的开发海外客户的方式,相信即便是外贸新手也或多或少有所耳闻,甚至已经通过邮件开发到了一些有意向的客户,但有时也会遇到开发信效果不好的情况,收到的回复寥寥无几。其实说白了开发信的本质与派发传单相同&#…

李开复已经对美图公司失去耐心,并在美图公司身上损失惨重

来源:猛兽财经 作者:猛兽财经 猛兽财经经过对美图公司(01357)的投资人回报、产品、业务结构、战略、财务业绩、估值等方面进行了研究,认为美图这家公司不行,非常不看好,以下是理由供你参考。一…

10 Seata配置Nacos注册中心和配置中心

Seata配置Nacos注册中心和配置中心 Seata支持注册服务到Nacos,以及支持Seata所有配置放到Nacos配置中心,在Nacos中统一维护; 高可用(集群)模式下就需要配合Nacos来完成: 具体配置如下 注册中心 Seata-server端配置注册中心,…

【洛谷 P1219】[USACO1.5]八皇后 Checker Challenge 题解(深度优先搜索+回溯法)

[USACO1.5]八皇后 Checker Challenge 题目描述 一个如下的 666 \times 666 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。 上面的布…

13_MySQL中的约束

目录 1. 约束(constraint)概述 1.1 为什么需要约束 1.2 什么是约束 1.3 约束的分类 2. 非空约束 2.1 作用 2.2 关键字 2.3 特点 2.4 添加非空约束 2.5 删除非空约束 3. 唯一性约束 3.1作用 3.2 关键字 3.3 特点 3.5 关于复合唯一约束 4. 主键(PRIMARY KEY)约束 4.1 作用 4.2 关…

【Django】Hello,DJango!

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…

如何实现报表可视化,有没有工具推荐

随着数据量的不断增长,如何更好地进行数据分析和可视化已成为企业和组织面临的重要挑战。实现报表可视化是一个很好的解决方案,它可以帮助用户更好地理解和分析数据,发现趋势和模式,并支持数据驱动的决策。本文将介绍如何实现报表…

现代卷积神经网络(NiN),并使用NIN训练CIFAR10的分类

专栏:神经网络复现目录 本章介绍的是现代神经网络的结构和复现,包括深度卷积神经网络(AlexNet),VGG,NiN,GoogleNet,残差网络(ResNet),稠密连接网络…

【3.7】Redis数据类型、CPU缓存一致性、哈希表

文章目录数据类型篇StringListHashSetZsetBitMapHyperLogLogGEOStreamCPU 缓存一致性CPU是如何执行任务的?什么是软中断?为什么0.1 0.2不等于0.3?哈希表数据类型篇 String String 是最基本的 key-value 结构,key 是唯一标识&…

03 | 授权服务:授权码和访问令牌的颁发流程是怎样的? 笔记

03 | 授权服务:授权码和访问令牌的颁发流程是怎样的? 授权服务的工作过程 小兔软件需要去到京东的平台那里”备案“注册,京东商家开放平台就会给小兔软件 app_id 和 app_secret 等信息,以方便后面授权时的各种身份校验&#xff0…

scratch绘制雷达 电子学会图形化编程scratch等级考试三级真题和答案解析2022年9月

目录 scratch绘制雷达 一、题目要求 1、准备工作 2、功能实现 二、案例分析

阶段二12_面向对象高级_继承1

一.继承的入门介绍 (1)继承的概念理解 让类与类之间产生关系(子父类关系),子类可以直接使用父类中非私有的成员 (2)通过extends关键字实现继承 格式:public class 子类名 extends 父类名 { } 范例:public class Zi e…

Grafana 如何使用本地CSV文件作为数据源

Grafana提供了一个插件,可以把CSV文件作为数据源,关于CSV插件的说明,可以参考:https://grafana.com/grafana/plugins/marcusolsson-csv-datasource/?tabinstallation。我是在本地使用命令行grafana-cli plugins install marcusol…

通过45人!1-2月,誉天红帽RHCE学员再创佳绩!

学习的喜悦在于结果,也在于过程;在于取得成功时的豁然开朗,也在于持之以恒后的层层递进。结果固然重要,但在求知过程中获得的满足感,也同样让人乐在其中。 RHCE的学习过程就充满了这样的喜悦。对每一行命令的理解、对每…

【Linux学习】日积月累——调试器gdb的使用教程

一、背景 gdb是一款强大的命令行调试工具,可以形成执行程序、脚本。只需要几个简单的命令,就能够实现Windows环境下VC等IDE的图形化调式工具的功能。 调试的相关常识: 程序的发布方式有两种,debug模式和release模式;L…

197.Spark(四):Spark 案例实操,MVC方式代码编程

一、Spark 案例实操 1.数据准备 电商网站的用户行为数据,主要包含用户的 4 种行为:搜索,点击,下单,支付 样例类: 2. Top10 热门品类 先按照点击数排名,靠前的就排名高;如果点击数相同,再比较下单数;下单数再相同,就比较支付数。 我们有多种写法,越往后性能越…

【Linux开发笔记】《Linux嵌入式开发从0到1》(一):初探Linux——与Linux的初次相遇

1.什么是Linux Linux就是一个操作系统,就是一个开源、自由的操作系统,就是一个免费使用和自由传播的类UNIX操作系统,就是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。 简单来讲,Linux就是一个操作系统而已… …

React的Hooks

React Hooks useState useMemo 和usecallback Hooks显示的指明因变量有什么好处 当使用时,y与changeX会被缓存下来,只要x不变,始终读取的是缓存的值, 如果不使用时,每次函数组件执行时,实际会基于x&#xf…

计算机写论文时,怎么引用文献? - 易智编译EaseEditing

首先需要清楚哪些引用必须注明[1]: 任何直接引用都要用引号并注明来源; 任何不是自己的口头或书面的观点、解释和结论都应注明来源; 即使不用原话,但是他人的思路、概念或观点也应注明; 不要为了适合你的观点修改原…

机器学习——无监督学习

机器学习的分类一般分为下面几种类别:监督学习( supervised Learning )无监督学习( Unsupervised Learning )强化学习( Reinforcement Learning,增强学习)半监督学习( Semi-supervised Learning )深度学习(Deep Learning)Python Scikit-learn. http: // …