ES11 (ECMAScript 2020)新语法:可选链操作符(?.)与空值合并操作符(??)

随着 JavaScript 近年来在前端开发场景中的广泛应用,越来越多的 JavaScript 新语法不断被引入,以便开发人员更高效地编写代码。在 ES11 中引入的新语法——可选链操作符(?.)与空值合并操作符(??),为开发人员提供了更好的方式处理空值和简化代码。这篇文章将详细介绍这两个新的 JavaScript 语法,其深度、学习和指导意义。

可选链操作符(?.)

当我们访问对象的属性时,如果该属性不存在,就会返回 undefined。这种情况下,如果我们想要访问嵌套对象属性,就必须手动检查每一个嵌套的属性是否存在,以免因未定义而导致 TypeError 错误。这种检查可以通过 if 语句、三元运算符和 && 运算符等来实现,但是需要编写更多的代码,使得代码变得复杂。

在新的语法中,可选链操作符(?.)就提供了一种简便的方式来访问嵌套对象属性。它可以有效地处理对象属性不存在的情况,使得代码更加简单、易读、易于维护。

先来看一个传统的嵌套对象属性访问代码:

----- ---- - - ----- ------- -------- - ----- ---- ----- - --
----- ---- - ------------ - ----------------- - ----------

这里我们通过使用问号和点(? .)来处理 user 对象中 address 属性的存在性。当 address 属性存在时,才能访问到 city 属性。如果我们想要访问更深层次的对象属性,那就得加上更多的问号和点号。

看一下使用可选链操作符(?.)重写的代码:

----- ---- - - ----- ------- -------- - ----- ---- ----- - --
----- ---- - -------------------

可以看到,使用可选链操作符(?.)可以大大减少对于属性的存在性的判断。此外,可选链操作符(?.)也可以用来访问数组的元素,如:

----- --- - --- -- ---
----- ------ - -------------

上面这段代码可以有效地避免了访问 undefined/null 值的问题。

空值合并操作符(??)

在 JavaScript 中,当我们需要检查变量是否存在以及它的值是否为 null、undefined 或者空字符串时,通常会用条件运算符(?:)来写出一些冗长的代码。这不仅会使代码变得不易读,还会增加不必要的代码行数。在新的 JavaScript 语法中,空值合并操作符(??)就被添加进来了。

使用空值合并操作符(??)可以更加简单地检查变量是否存在,如果变量不存在或者值为 null、undefined 或空字符串,就可以用默认值来代替。使用这个操作符时,左侧行表达式的值如果为 null 或者 undefined,那么就会取右侧的值,否则就会取左侧行表达式的值。如下代码:

----- ------- - ------------ -- ----------

在上面的例子中,?? 操作符用来替代 || 操作符。如果 user.address 的值为 null、undefined 或者空字符串,就会返回 'Unknown'。

需要注意的是,?? 操作符只会在左侧值为 null 或 undefined 时才会返回右侧的值。如果左侧值是 false、0 或 ””,则并不会触发空值合并操作,这和 || 操作符有所不同。如下代码:

----- ---- - ---
----- ------ - ---- -- ---------- -- ------ - --
----- ------- - ---- -- ---------- -- ------- - ---------

示例代码

最后,为了更好地理解可选链操作符(?.)和空值合并操作符(??),这里提供一些示例代码:

-- --------------------
----- ---- - - ----- ------- -------- - ----- ---- ----- - --
----- ---- - -------------------

-- -- ---- -
----- --- - --- -- ----- ---
----- ----------- - --------------- -- ---- --- ------

-- --------------
----- ---- - ---
----- ------ - ---- -- ----------

-- ---------
----- ------ - ----------
----- ------ - -----
----- ------ - ---
----- ------- - ------ -- ------ -- ------ -- ----------

总结

在本文中,我们详细介绍了可选链操作符(?.)和空值合并操作符(??)这两个 JavaScript 新语法的特点和用法。可选链操作符(?.)可以更加简便地处理嵌套对象属性的访问问题,而空值合并操作符(??)则可以更加轻松地处理变量默认值的赋值问题。尽管这两个新语法都不是必不可少的,但是它们的引入无疑使得代码更加整洁、可读、易于维护。我相信这两个语法对于前端开发人员一定会有好处。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64fc7e3cf6b2d6eab322d2a9


猜你喜欢

  • ES11 (2020) 中的可选链操作符:如何避免代码崩溃和浪费性能?

    在前端开发中,我们经常需要处理从后端接收到的数据。这些数据通常是嵌套的对象或数组,而我们需要在代码中访问这些数据的属性或元素。然而,如果数据中某些属性或元素不存在,我们的代码可能会崩溃,因为 Java...

    1 年前
  • Jest 测试中使用 Sinon Spy 的最佳实践

    在前端开发中,测试是至关重要的一环。Jest 是一个非常流行的 JavaScript 测试框架,而 Sinon 则提供了丰富的测试工具,包括 Spy、Stub、Mock 等。

    1 年前
  • ESLint 与 Jest:如何结合 ESLint 与 Jest 检测代码覆盖率?

    ESLint 与 Jest:如何结合 ESLint 与 Jest 检测代码覆盖率? 前端开发过程中,我们不仅需要关注代码的正确性,还需注重代码的质量和可维护性。其中,代码规范和代码覆盖率是两个非常重要...

    1 年前
  • ECMAScript 2017 (ES8) 利用 Object.entries() 实现对象双向映射

    在前端开发中,对象双向映射经常被用到。在 ES8 中,我们可以利用 Object.entries() 方法实现对象双向映射,使得代码更加简单易懂。 Object.entries() 方法 Object...

    1 年前
  • Redux 异步 action 解决方案

    在前端开发中,我们经常会遇到需要异步获取数据并更新 Redux store 的情况。Redux 官方提供了一种异步 action 解决方案,本篇文章将详细介绍该解决方案,包括如何使用和注意事项。

    1 年前
  • Material Design 中的响应式图片布局

    Material Design 是 Google 推出的一种设计规范,旨在创建功能强大且富有美感的移动设备和 Web 应用程序。在 Material Design 中,响应式图片布局是其重要组成部分之...

    1 年前
  • Node.js Headless CMS 及其实现方案的分享

    在现代 Web 开发中,使用 Headless CMS 来管理和发布内容是一个常见的方案。Headless CMS 本质上是一个将内容从展示与管理分离的系统,它能够提供一套 API 接口供外部系统调用...

    1 年前
  • 十分钟读懂 Docker Ruby on Rails 应用部署

    前言 Docker 是一种容器化技术,可以让应用在不同的环境中运行,适合单独部署应用。在本文中,我们将介绍如何使用 Docker 来部署一个 Ruby on Rails 应用程序。

    1 年前
  • PWA 应用如何克服由数据负载引起的性能问题?

    前言 在当今互联网时代,Web 应用程序已经成为人们的重要工具之一。随着移动互联网的普及,PWA(Progressive Web App)应用逐渐兴起,成为前端应用程序的一种新兴形态。

    1 年前
  • 使用 Express.js 和 Passport 实现本地登录和社交登录功能

    在现代 Web 开发中,身份验证和鉴权是非常重要的一部分。 本文将详细介绍如何使用 Express.js 和 Passport 实现本地登录和社交登录功能,以及一些常见的身份验证模式,包括基本身份验证...

    1 年前
  • Socket.io 中如何优雅地处理房间内聊天信息?

    随着互联网技术的发展,即时通信成为了人们日常生活和工作中重要的交流方式,而 Socket.io 作为一个实时通信库,在 Web 开发中扮演着不可替代的角色。在 Socket.io 中,房间(room)...

    1 年前
  • Sequelize 中使用 UTC 时间的处理方法

    在 Web 开发中,处理时间是非常常见的需求。在使用 Sequelize 这个 Node.js ORM (Object-Relational Mapping) 框架时,处理时间的方法也截然不同。

    1 年前
  • MongoDB 高并发场景下性能优化实践

    MongoDB 是当今互联网时代中最流行的 NoSQL 数据库之一,得益于其灵活的模式和卓越的性能,被广泛应用于大数据存储、高并发 Web 应用等场景。然而,在这些高压力的场景下,MongoDB 的性...

    1 年前
  • Cypress 测试框架中的批量运行与调试技巧

    Cypress 是一个基于 JavaScript 的前端测试框架,它能够自动化地运行你的测试用例,模拟浏览器行为,检查网站的正确性和完整性。Cypress 的最大优势在于它的高度可控性和可定制性,它提...

    1 年前
  • SSE 在物联网领域中的应用与发展

    SSE(Server-Sent Events)是一种基于HTTP的服务器推送技术,它可以在客户端和服务器之间建立长连接,服务器可以随时向客户端推送数据。在物联网领域中,SSE有着非常广泛的应用,可以提...

    1 年前
  • Fastify 插件开发入门

    前言 Fastify 是一个快速和低开销的 Web 框架,它有很多内置的插件,这些插件可以帮助你更方便地开发 Web 应用程序。同时,它还提供了一个简单而强大的插件开发 API,通过自定义插件,可以让...

    1 年前
  • 如何在 Node.js 中进行 TCP/UDP 通信

    如何在 Node.js 中进行 TCP/UDP 通信 Node.js 是一个非常强大的开发工具,它可以用于前端开发,后端开发以及网络编程等领域。当我们需要进行TCP/UDP通信时,Node.js提供了...

    1 年前
  • Mongoose:如何维护多个 MongoDB 数据库连接

    Mongoose 是一个 MongoDB ORM 库,它可以帮助我们在 Node.js 应用中方便地操作 MongoDB 数据库。但是,当我们需要连接多个 MongoDB 数据库时,会带来一些挑战。

    1 年前
  • ES12 中的众多正则表达式特性详解

    正则表达式是前端开发中非常重要的一部分,它可以用来处理字符串、表单验证、路由匹配等任务。ES12 提供了一些新的正则表达式特性,让我们来一一了解。 s 标志符 在 ES12 中,正则表达式新增了一个 ...

    1 年前
  • Deno 如何实现服务器端渲染?

    Deno 是一个现代化的 TypeScript 运行时环境,它内置了安全性功能和标准库,能够轻松管理依赖。相比于 Node.js,Deno 更加安全,在不需要安装外部依赖的情况下,支持 TypeScr...

    1 年前

相关推荐

    暂无文章