JS的链判断符有几种写法,有哪些用法?

你好,我是沐爸,欢迎点赞、收藏、评论和关注。

在 ES6 之前如何判断一个对象深层嵌套的属性?ES6 的链判断符又是怎么简化操作的呢?它有几种写法?带着这三个问题,我们一起看一看。

ES6 之前

在 ES6 之前的 JS 中,如果读取对象内部的某个属性,往往需要判断一下,属性的上层对象是否存在。比如,读取message.body.user.firstName这个属性,安全的写法是写成下面这样。

// 错误的写法
const  firstName = message.body.user.firstName || 'default';// 正确的写法
const firstName = (message&& message.body&& message.body.user&& message.body.user.firstName) || 'default';

三元运算符?:也常用于判断对象是否存在。

const firstName = user ? user.firstName : 'default'

以上两种判断其实都有局限性,它们在判断对象的最后一层属性,只要属性值是假(0,false,null,“”,undefined),结果都会是默认值,这在一些情况下并不符合要求。

ES6 链判断符 ?.

ES6 新增了链判断符,会从左到右评估其表达式,如果某个属性的值为 null 或 undefined,则表达式短路返回 undefined,而不是抛出错误。这个操作符允许你安全地读取深层嵌套对象属性的值,而无需显式地验证每一层是否存在,使用非常方便。注意,短路逻辑的特点是,只要不满足条件,就不再往下执行。

链判断运算符 ?. 有三种写法

  • obj?.prop// 对象属性是否存在
  • obj?.[expr]// 同上
  • func?.(...args) // 函数或对象方法是否存在
a?.b
// 等同于
a == null ? undefined : a.ba?.[x]
// 等同于
a == null ? undefined : a[x]a?.b()
// 等同于
a == null ? undefined : a.b()a?.()
// 等同于
a == null ? undefined : a()

常见用法示例如下:

示例一:访问深层嵌套属性

假设我们有一个包含多层嵌套对象的用户数据,我们想要安全地访问用户的城市信息:
const user = {id: 1,name: '张三',address: {street: '长安街2024号',city: '北京'}
}// 使用链判断符
const city = user?.address?.city
console.log(city) // 北京  // 如果 address 属性不存在
const user2 = {  id: 2,name: '李四'
}
const city2 = user2?.address?.city 
console.log(city2) // undefined

示例二:调用可能不存在的方法

在尝试调用一个对象的方法之前,我们可以使用链判断符来检查该方法是否存在:
const obj = {greet: function() {console.log('Hello!')}
}// 使用链判断符调用方法
obj?.greet?.(); // 输出: Hello!// 如果方法不存在
obj?.say?.() // 不会抛出错误,只是什么也不做

示例三:结合空值合并操作符使用

链判断符经常与空值合并操作符(` ??` )一起使用,以在属性不存在时提供一个默认值:
const user2 = {id: 2,name: '李四'  
}// 使用可选链和空值合并操作符
const city = user?.address?.city ?? 'Unknown City'
console.log(city) // Unknown City

示例四:处理数组和函数返回值

链判断符也可以用于处理数组和函数的返回值,当你不确定它们是否为` null` 或` undefined` 时:
const arr = [1, 2, 3, { name: 'Item 4' }]
const item3 = arr[3]?.name
console.log(item3) // Item 4// 如果索引超出范围  
const item10 = arr[10]?.name
console.log(item10) // undefined// 函数返回值示例  
function getUser() {// 假设这个函数在某些情况下返回 nullreturn null
}const userName = getUser()?.name ?? 'unKnown'
console.log(userName) // unKnown

好了,分享结束,谢谢点赞,下期再见。

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

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

相关文章

深度学习:卷积神经网络CNN

目录 一、什么是卷积? 二、卷积神经网络的组成 1. 卷积层 2. 池化层 3. 激活函数 4. 全连接层 三、卷积神经网络的构造 四、代码实现 1.数据预处理 2.创建卷积神经网络 3.创建训练集和测试集函数 4.创建损失函数和优化器并进行训练 一、什么是卷积&…

LPDDR4芯片学习(一)——基础知识与引脚定义

一、基础知识 01 dram基本存储单元 当需要将一位数据存储到DRAM中时,晶体管会充电或放电电容。充电的电容表示逻辑高(1),放电的电容表示逻辑低(0)。由于电容会随着时间泄漏电荷,因此需要定期刷…

学习记录:js算法(四十三):翻转二叉树

文章目录 翻转二叉树我的思路网上思路递归栈 总结 翻转二叉树 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点 图一: 图二: 示例 1:(如图一) 输入:root [4,2,7,1…

Python记录

1.冒泡排序 时间复杂度O(n^2) 选择、插入都是 def bubble(data, reverse):for i in range(len(data)-1):for j in range(len(data)-i-1):if data[j] > data[j1]:data[j], data[j1] data[j1], data[j]if reverse:data.reverse()return data 2.快速排序 时间…

护理陪护小程序|陪护系统||陪护系统开发

在当今社会,随着人口老龄化的加剧和家庭结构的变化,护理与陪护服务的需求日益增长。为了更好地满足这一市场需求,并提升服务效率与质量,护理陪护小程序应运而生。这类小程序不仅为用户提供了便捷、高效的服务预约与管理平台&#…

828华为云征文 | 云服务器Flexus X实例,Docker集成搭建Redis集群

828华为云征文 | 云服务器Flexus X实例,Docker集成搭建Redis集群 Redis 集群是一种分布式的 Redis 解决方案,能够在多个节点之间分片存储数据,实现水平扩展和高可用性。与传统的主从架构不同,Redis 集群支持数据自动分片、主节点故…

J Transl Med结肠癌分子分型+简单实验

目录 技术路线 实验设计(药物敏感性) 亮点 方法 从 TCGA 和 GEO 数据库下载大量和单细胞 RNA 测序以及 CRC 的临床数据。HRGs 和 LMRGs 来自分子特征数据库。使用 R 软件包 DESeq2 进行差异表达分析。使用无监督聚类进行分子亚型。使用单变量 Cox 回…

嘉宾云集旌城 只为大赛而来 2024ISGC国际烈酒(中国)大奖赛在德阳落下帷幕

秋高气爽、古蜀之源,迎来第六届国际烈酒(中国)大奖赛;五谷丰登、重装之都,齐聚百名国际烈酒大奖赛评委。 9月18日,由德阳市人民政府、国家葡萄酒及白酒露酒产品质量检验检测中心、上海合作组织多功能经贸平…

图片压缩怎么弄?教你5种图片压缩小技巧

现如今,图片已成为我们日常生活和工作不可或缺的一部分。然而,高清图片往往伴随着庞大的文件体积,给存储和传输带来诸多不便。这时候我们就需要对图片进行适当的压缩处理,那么该怎么做呢?下面教大家5种图片压缩小技巧&…

GBase 8s 安装手册

没有失败,只有暂时停止成功! 一:简介 GBase 8s 产品支持多种处理器平台,除国际主流的 x86_64 处理器(包括 Intel 和 AMD) 外,全面支持飞腾、鲲鹏、龙芯、兆芯、海光、申威等国产处理器。 GBas…

2025秋招内推|招联金融

【投递方式】 直接扫下方二维码,使用内推码: igcefb 【招聘岗位】 深圳,武汉: 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策划 产品运营 客户体验管理 风险管理 资产管理 【校招流程】 简历投递:9月…

kafka 消费者线程安全问题详细探讨

内容概要 主要内容 常见错误案例 下面这段代码大概逻辑 初始化时 实例化KafkaConsumer, 开启线程拉取消息并且处理 资源释放回调 停止线程、调用kafkaConsumer.close进行资源释放 表面上没有问题,但实际上可能出现线程安全问题,因为poll 和 close 两…

Jetpack Compose 核心组件(Text, Images, Buttons)(6)

导读大纲 1.1 基本组件介绍1.2 Text1.2.1 基本用法1.2.2 设计文字风格 1.3 Image组件1.3.1 从各种来源加载图片1.3.2 关键属性1.3.3 如何加载和显示不同类型的图像1.3.4 内容描述和无障碍访问: 1.4 Button组件1.4.1 基本用法1.4.2 装饰和自定义1.4.3 处理按钮点击1.4.4 重要考虑…

基于python深度学习遥感影像地物分类与目标识别、分割实践技术

我国高分辨率对地观测系统重大专项已全面启动,高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB,遥感大数据时…

JS惰性函数两种实现方式

惰性函数的本质就是函数重写,所谓惰性载入,指函数执行的分支只会发生一次。那什么时函数重写呢?由于一个函数可以返回另一个函数,因此可以用新的函数在覆盖旧的函数。 惰性函数有两种实现方式: 1、在函数被调用时&am…

案例研究丨国控星鲨利用DataEase释放数据潜能,重塑业务视野

国药控股星鲨制药(厦门)有限公司(以下简称为国控星鲨)始创于1952年,前身为厦门鱼肝油厂,距今已经有70余年历史,是国家商务部认定的“中华老字号”企业。2011年,国药控股与厦门轻工集…

2024年国庆小长假即将来临,陪猫咪的同时应该如何清浮毛

在父母眼中我们是不是永远都长不大?每次和他们讨论一点事情就开始吵起来。这不,前两天想着和好久不见的朋友去见面,出门前还要被逼问一番。 去到朋友家,发现朋友养了两只可爱的小猫,一时心动上头,我也转身…

通信工程学习:什么是MANO管理编排

MANO:管理编排 MANO:Management and Network Orchestration(管理和网络编排)在网络功能虚拟化(NFV)架构中扮演着至关重要的角色。MANO是一个由多个功能实体组合而成的层次,这些功能实体负责管理…

地图定位流程

用户端在小程序认证通过后会自动进行定位,也可以在首页手动定位,定位成功后用户在查询家政服务项目时会根据定位的城市查询该城市有哪些服务项目。 高德地图配置 小程序端的定位是通过手机的定位模块进行定位,定位成功获取经纬度坐标&#x…

吸烟行为检测、重点区域吸烟检测、吸烟检测算法样本标注

吸烟检测算法主要用于公共场所、工作场所和家庭环境中的吸烟行为监控,通过图像识别技术来检测和识别吸烟行为,以确保环境卫生和公共安全。这种技术可以帮助管理者实时监控吸烟行为,及时采取措施,减少二手烟的危害。 一、技术实现…