可选链操作符(?.)、空值合并操作符(??)

什么是可选链(?.)

可选链(Optional Chaining,?.)是 JavaScript 提供的一种语法,用于在访问嵌套对象属性时,防止因访问不存在的属性而导致的运行时错误。可选链操作符允许您安全地访问深层次的属性,即使其中某些属性不存在,也不会导致错误,而是返回 undefined。

可选链的使用场景

  1. 访问对象属性:当不确定某个属性是否存在时,可以使用可选链安全地访问它。
  2. 调用方法:当不确定某个方法是否存在时,可以使用可选链安全地调用它。
  3. 访问数组元素:当不确定数组是否存在时,可以使用可选链安全地访问数组元素。
  4. 组合使用:可选链可以与其他操作符组合使用,比如 nullish 合并操作符 ??,以提供默认值。

示例代码和分析

访问对象属性
假设我们有一个用户对象:

const user = {name: 'Alice',address: {street: '123 Main St',city: 'Wonderland'}
};// 使用可选链访问嵌套属性
const street = user?.address?.street;
console.log(street); // 输出: '123 Main St'// 当 address 属性不存在时,不会报错,而是返回 undefined
const zipCode = user?.address?.zipCode;
console.log(zipCode); // 输出: undefined// 当 user 对象不存在时,不会报错,而是返回 undefined
const city = undefinedUser?.address?.city;
console.log(city); // 输出: undefined

调用方法
假设我们有一个用户对象,包含一个可选的 greet 方法:

const user = {name: 'Alice',greet() {console.log('Hello, ' + this.name);}
};// 安全地调用 greet 方法
user.greet?.(); // 输出: 'Hello, Alice'// 当 greet 方法不存在时,不会报错,而是返回 undefined
const anotherUser = { name: 'Bob' };
anotherUser.greet?.(); // 不输出内容

访问数组元素
假设我们有一个可能为空的数组:

const data = {items: ['apple', 'banana', 'cherry']
};// 安全地访问数组元素
const firstItem = data.items?.[0];
console.log(firstItem); // 输出: 'apple'// 当 items 数组不存在时,不会报错,而是返回 undefined
const secondItem = data.nonExistentArray?.[1];
console.log(secondItem); // 输出: undefined

组合使用
可选链可以与 nullish 合并操作符 ?? 结合使用,以提供默认值:

const user = {name: 'Alice',preferences: {theme: 'dark'}
};// 使用可选链和 nullish 合并操作符提供默认值
const theme = user.preferences?.theme ?? 'light';
console.log(theme); // 输出: 'dark'// 当 preferences 或 theme 不存在时,提供默认值
const anotherUser = { name: 'Bob' };
const anotherTheme = anotherUser.preferences?.theme ?? 'light';
console.log(anotherTheme); // 输出: 'light'

多种使用场景分析

  1. 访问深层嵌套对象属性:在复杂的数据结构中,访问深层嵌套的属性时,可以避免大量的条件检查和潜在的错误。例如,在处理来自 API 的嵌套响应数据时,可选链特别有用。
  2. 调用可选方法:在面向对象编程中,当对象的方法可能不存在时,使用可选链可以避免调用未定义的方法导致的错误。
  3. 安全地处理数组和列表:在处理动态生成的数组时,使用可选链可以确保安全地访问数组元素,即使数组为空或未定义。
  4. 提供默认值:与 nullish 合并操作符结合使用,可以为可能未定义的值提供默认值,简化代码逻辑。

结论

可选链操作符 ?. 提供了一种简洁、安全的方式来访问对象、方法和数组的属性,避免运行时错误。通过理解和应用可选链,您可以编写更健壮、更可维护的代码。

可选链(?.)和空值合并(??)是es6 还是 es8的?

可选链操作符 (?.) 和空值合并操作符 (??) 都不是 ES6(ECMAScript 2015)或 ES8(ECMAScript 2017)的一部分。它们是 ECMAScript 2020(也称为 ES11)中的新增特性。

可选链操作符(Optional Chaining,?.)

可选链操作符允许开发者在访问对象的属性或调用方法时,安全地处理 null 或 undefined。这个操作符于 ECMAScript 2020 中引入。

空值合并操作符(Nullish Coalescing,??)

空值合并操作符用于处理 null 或 undefined,为这些情况提供一个默认值。它也于 ECMAScript 2020 中引入。

示例

可选链操作符示例

const user = {name: 'Alice',address: {street: '123 Main St'}
};const street = user?.address?.street;
console.log(street); // 输出: '123 Main St'const zipCode = user?.address?.zipCode;
console.log(zipCode); // 输出: undefinedconst city = undefinedUser?.address?.city;
console.log(city); // 输出: undefined

空值合并操作符示例

const foo = null ?? 'default';
console.log(foo); // 输出: 'default'const bar = undefined ?? 'default';
console.log(bar); // 输出: 'default'const baz = 0 ?? 'default';
console.log(baz); // 输出: 0const qux = '' ?? 'default';
console.log(qux); // 输出: ''

结论

可选链操作符 (?.) 和空值合并操作符 (??) 都是 ECMAScript 2020 中引入的特性,不属于 ES6 或 ES8。通过这些特性,JavaScript 提供了更简洁和安全的方式来处理可能为 null 或 undefined 的值,从而提升了代码的健壮性和可读性。

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

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

相关文章

5G/4G/北斗遥测终端机全国各省水利平台无缝对接

物联网技术的广泛应用正在深刻影响水利行业,计讯物联致力于推动水利技术的持续革新和服务的持续升级,依托国家级专业水利资质认证,在多个大型水利项目中展现的项目管理专长,为水利项目建设提供了高效的解决方案,持续推…

NodeJs 连接本地 mySql 数据库获取数据

写在前面 今天把 nodejs 连接本地数据库的坑简单的踩一下,为后续写接口做个铺垫 安装 mySql (mac举例子) 安装地址 安装完成大概这个样子,起动起来就行 安装本地数据库连接工具(navicat举例子) 安装地…

自定义模板DIY专属CSDN个人主页!HTML+CSS个性化全攻略

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 💯如何通过HTMLCSS自定义模板diy出自己的个性化csdn主页&#x…

单链表经典算法题2

🌹个人主页🌹:喜欢草莓熊的bear 🌹专栏🌹:数据结构 前言 这次介绍的题会比上次更有难度哦,宝宝们系好安全带。咱们出发了! 一、合并两个有序链表 1.1思路 创建一个新链表来接收合并…

基于FPGA的Cordic向量模式原理及设计

目录 一、向量模式 1、向量模式原理 1.1 1.2 2、向量模式的MATLAB仿真 3、向量模式的FPGA实现 3.1 预处理 3.2 迭代 3.3 结果计算 一、向量模式 1、向量模式原理 已知直角坐标下一点(x,y),如何求该点在极坐标系的坐标&a…

问题1.用PGP解密出keybox.xml,过程中报“Can‘t check signature: No public key”如图,这个正常吗?如何解决?

问题1.我要写Google attenstation key到设备。就需要keybox.xml生成keybox.kdb文件。而测试机构给我们的是加密的文件,需要用PGP解密出keybox.xml,过程中报“Can’t check signature: No public key”如图,这个正常吗?如何解决&am…

真实前端面试题(蚂蚁外包)

1.闭包定义应用场景 闭包(Closure) 是指一个函数包含了对其外部作用域中变量的引用,即使在该函数外部作用域执行完毕后仍然可以访问这些变量。闭包允许你在一个函数内部访问另一个函数的变量,这在许多编程语言中是一种强大的特性…

IPv6 中 MAC 33:33 的由来

一、33:33 由来 1. RFC9542 - 2024-05-02 Note IANA allocates addresses under the IANA OUI (00-00-5E) as explained in [RFC9542]. Unicast addresses under the IANA OUI start with 00-00-5E, while multicast addresses under the IANA OUI start with 01-00-5E. In t…

React的列表和Key

React的列表 如果我们要在React中把一个数组转化成为我们的列表要怎么转换呢? 你可以通过使用 {} 在 JSX 内构建一个元素集合。 //定义一个NumberList组件 function NumberList(props) {//使用组件需要传入一个number值const numbers props.numbers;//使用 map(…

2024华为OD机试真题- 计算三叉搜索树的高度-(C++/Python)-C卷D卷-100分

2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 题目描述 定义构造三叉搜索树规则如下: 每个节点都存有一个数,当插入一个新的数时,从根节点向下寻找,直到找到一个合适的空节点插入。查找的规则是: 1.如果数小于节点的数减去500,则将数插入节点的左子树 2.如果数大于…

【OC】为category添加weak属性

友友们都知道,分类当中是不能添加property的,因为运行时系统不会自动完成synthesize,所以需要使用runtime的关联对象形式完成property。也就是这一对函数 /** 设置关联对象 param object : 添加属性的对象,通常填入se…

T200HSA单路SDI/HDMI+1路3.5音频高清万能采集卡

产品简介: 同三维T200HSA单路高清万能采集卡,可以采集1路SDI/HDMI高清信号1路3.5音频信号,卡上有1个是HDMI接口1个是SDI接口1个3.5音频口,配件有: 1个小档板,PCI-E2.0 X1,分辨率最高可以达到10…

机器学习模型评估之校准曲线

模型校准曲线(Calibration Curve),也称为可靠性曲线(Reliability Curve)或概率校准曲线(Probability Calibration Curve),是一种评估分类模型输出概率准确性的图形工具。它可以帮助我…

【python数据可视化】利用Python爬取天气数据并实现数据可视化,绘制天气轮播图

用Python爬虫抓取全年天气数据并绘制天气轮播图 一、运行结果: 二、代码展示: 由csv文件生成↓ 接下来是绘制天气轮播图 运行结果: 完整代码请看这里↓👇 提醒制作这个项目你需要执行以下几个步骤: 确定数据源&#x…

OTN分层结构变成什么样了?

传统OTN的三层架构包括光传输段层(OTS)、光复用段层(OMS)和光通道层(OCh),它们共同构成了OTN的三层结构。 其中: 光传输段层(OTS):OTS是OTN中最高…

React是如何渲染元素和组件的

元素的概念 元素是构成 React 应用的最小单位。元素描述了你在屏幕上想看到的内容。React 元素是创建开销极小的普通对象。React DOM 会负责更新 DOM 来与 React 元素保持一致。 将一个元素渲染为 DOM 假设我们的 HTML 文件有一个根元素 <div>该节点内的所有内容都将由 …

鸿蒙 Web组件的生命周期(api10、11、12)

概述 开发者可以使用Web组件加载本地或者在线网页。 Web组件提供了丰富的组件生命周期回调接口&#xff0c;通过这些回调接口&#xff0c;开发者可以感知Web组件的生命周期状态变化&#xff0c;进行相关的业务处理。 Web组件的状态主要包括&#xff1a;Controller绑定到Web组…

力扣SQL50 平均售价 ifnull SUM 连表查询

Problem: 1251. 平均售价 &#x1f468;‍&#x1f3eb; 参考题解&#xff08;题目数据增强&#xff0c;代码只能过90%的点&#xff09; &#x1f37b; AC code SELECT p.product_id, ROUND(ifnull(SUM(units * price) / SUM(units), 0),2) AS average_price FROM prices a…

初学51单片机之数字秒表

不同数据类型间的相互转换 在C语言中&#xff0c;不同数据类型之间是可以混合运算的。当表达式中的数据类型不一致时&#xff0c;首先转换为同一类型&#xff0c;然后再进行计算。C语言有两种方式实现类型转换。一是自动类型转换&#xff0c;另外一种是强制类型转换。 转换的主…

2024GLEE生活暨教育(上海)博览会,8月20-22日,国家会展中心(上海)

2024GLEE生活暨教育(上海)博览会将于8月20-22日在中国国家会展中心&#xff08;上海&#xff09;举行&#xff0c;博览会总面积近万平方米&#xff0c;设有美好生活和教育产品两大主力展区&#xff0c;全面覆盖婴幼儿、学龄前、小学、初中、高中、大学、中年、老年各个年龄段的…