在 ECMAScript 2020 中使用可选链来规避 null 和 undefined 的问题

在前端开发中,经常会遇到空数据的情况,例如在请求后台接口时返回的数据可能为空,这时直接调用其中的属性或方法可能会出现 TypeError 的错误。为了解决这个问题,ECMAScript 2020 中添加了可选链(Optional Chaining)运算符,可以有效地规避 null 和 undefined 的问题。

什么是可选链?

可选链是 ECMAScript 2020 中添加的一种运算符,它可以用于访问对象的属性或方法,如果该属性或方法存在则返回对应的值,否则返回 undefined,避免了在访问不存在的属性或方法时出现 TypeError 错误。

可选链的语法形式如下:

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

其中,?. 是可选链操作符,它的作用是判断左侧的对象是否为 null 或 undefined,如果是,则返回 undefined,否则继续访问其属性或方法。

可选链运算符可以嵌套使用,例如:

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

可选链的应用场景

可选链在访问对象的属性或方法时非常实用,特别是在处理复杂的数据结构时更为突出。

1. 避免出现 TypeError 错误

在访问对象的某个属性时,如果该属性不存在,则会返回 undefined,而不是抛出 TypeError 错误。例如:

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

如果 message.sender 为 null 或 undefined,则 user 变量的值为 undefined,不会出现 TypeError 错误。

2. 检查函数是否存在

使用可选链可以检查对象中是否存在某个方法,从而避免在调用该方法时出现 TypeError 错误。例如:

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

如果 myLibrary 对象不存在,则调用 doSomething 方法时会返回 undefined,不会出现 TypeError 错误。

3. 避免繁琐的判断

在处理复杂的数据结构时,使用可选链可以避免繁琐的判断,例如:

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

如果 data 数组的第一个元素不存在或其 users 属性不存在或 users 中第一个元素不存在,则 result 的值将为 undefined,而不需要进行繁琐的判断。

可选链和 null 判断的比较

在访问对象的属性或方法时,使用可选链和 null 判断都可以解决出现 TypeError 错误的问题。但是,它们之间存在一些区别。

1. 可选链可以解决更复杂的问题

使用可选链可以解决更复杂的问题,特别是在处理嵌套的数据结构时更为实用。

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

使用可选链可以简化代码,避免繁琐的判断,而使用 if 语句需要编写更多的代码。

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

2. 可选链不支持旧版本浏览器

使用可选链需要 ECMAScript 2020 或更高版本的 JavaScript 引擎支持,因此不适用于旧版本的浏览器。而使用 if 语句可以兼容更多的浏览器。

可选链的示例代码

下面是一个使用可选链的示例代码:

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

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

在上面的代码中,如果 sender 属性不存在,则 userName 变量的值为 undefined,不会出现 TypeError 错误。

总结

借助 ECMAScript 2020 中的可选链操作符,我们可以避免在访问对象的属性或方法时出现 TypeError 错误,特别是在处理复杂的数据结构时更为实用。不过,需要注意的是,使用可选链需要 JavaScript 引擎支持,因此不适用于旧版本的浏览器。

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


猜你喜欢

  • ECMAScript 2015: Set 和 Map 的用法详解

    ECMAScript 2015(也称为 ECMAScript 6)是 JavaScript 的官方标准之一,其中引入了一些新的数据结构,包括 Set 和 Map。 Set 和 Map 是 JavaSc...

    1 年前
  • Flexbox 布局下的项间分隔线技巧

    Flexbox 是一种 CSS 布局模型,提供了一种强大的方式来管理盒子之间的关系,使得布局变得更加灵活,易于实现。但有时候,在项之间添加分隔线可以更好地区分它们之间的关系,以便更好地传达布局的含义。

    1 年前
  • Cypress 运行测试用例时如何控制 Chrome 浏览器的权限

    介绍 Cypress 是一个现代 Web 应用测试框架,它可以帮助我们轻松地编写、运行和调试前端测试用例。在运行测试用例时,Cypress 默认使用 Chrome 浏览器作为测试环境。

    1 年前
  • 无障碍网页开发中应对 IE 浏览器的兼容性方案

    背景 无障碍网页是指能够让所有人无论是否存在身体、智力、感官方面的障碍都能够访问和使用的网页,而其中最重要的一个因素就是兼容性。IE 浏览器虽然已经逐渐退出市场,但在某些领域,如政府机构和企业内部系统...

    1 年前
  • 基于 Enzyme 实现 React 组件的自动化测试流程

    React 是一个流行的前端框架,同时也是一个组件化的开发模式。组件是 React 应用程序中的基本单位,因此组件的测试是开发中不可或缺的一部分。Enzyme 是一个流行的 React 组件测试库,它...

    1 年前
  • MongoDB 在 Linux 平台下的备份与恢复

    简介 MongoDB 是一种 NoSQL 数据库,因其具有可扩展性、数据灵活性和卓越的性能而备受欢迎。在 Linux 平台下使用 MongoDB 时,数据库备份和恢复非常重要。

    1 年前
  • RxJS 中的操作符:map 和 flatMap 的区别

    在 RxJS 中,map 和 flatMap 都是常用的操作符。它们可以帮助我们对 Observable 发出的数据流进行转换操作。虽然它们都能实现对流中的数据进行转换,但在实际应用中却有着不同的作用...

    1 年前
  • Tailwind 中常见的响应式设计问题及解决方法

    Tailwind 提供了方便易用的响应式设计功能,可以根据设备尺寸自动应用样式。尽管 Tailwind 已经为我们提供了相应的解决方案,但在实际应用中,还是会遇到一些问题。

    1 年前
  • React Router 实现 SPA 应用时,如何避免路由跳转后页面不刷新的情况?

    什么是 SPA 应用? 单页面应用(SPA)是一种以 Web 应用方式呈现和交互的网页应用程序,其页面不需要重新加载或跳转。SPA 应用只在用户进入应用时加载必要的 HTML、CSS 和 JavaSc...

    1 年前
  • Web Components 性能优化及最佳实践

    随着 Web 技术的发展,前端开发已经发生了翻天覆地的变化。而在这个变革的过程中,Web Components 作为一种新型的前端技术,已经成为了前端开发中不可或缺的一部分。

    1 年前
  • 使用 DataLoader 解决 GraphQL 中的重复查询问题

    GraphQL 中的重复查询问题 在 GraphQL 查询中,经常会出现多次查询同一个数据的情况,这会极大地降低应用性能。例如,在一个社交应用中,一个用户可能会查询自己的好友列表并查看每个好友的基本信...

    1 年前
  • 利用 Server-sent Events 实现餐厅排号预约功能

    前言 餐厅排号预约功能在现代生活中已经非常常见,这种功能可以让用户无需到店现场等待,只需要提前在手机或电脑上预约,等到时间到了再到店用餐。本文将介绍如何利用 Server-sent Events 技术...

    1 年前
  • RESTful API 中的集成式和分离式部署方式选择

    前言 RESTful API 是现代 Web 应用的重要组成部分。它通过 HTTP 协议提供一个统一的接口,让客户端(如 Web 应用、移动应用、桌面应用等)与服务器端(如数据库、文件系统等)进行数据...

    1 年前
  • Node.js 请求参数为什么要进行编解码

    作为前端开发者,我们经常会用到 Node.js 来搭建后台服务,同时处理各种请求。而请求中的数据参数则是非常重要的一部分。然而,在处理这些参数时,可能遇到各种参数编码问题,比如乱码或者中文被转义等问题...

    1 年前
  • 使用 Chai.js 测试 Angular2 组件

    在 Angular2 开发中,组件作为页面构成的最基本单位,是整个前端开发的核心。为了保证组件的质量和稳定性,我们需要使用测试工具来对组件进行测试。 在本文中,我们将介绍如何使用 Chai.js 来测...

    1 年前
  • 如何在 ES7 中实现 ES6 的箭头函数

    在 ES6 中,箭头函数被引入作为一种新的函数类型,它有许多优点,如简化了函数的书写、可读性强等,所以成为了众多前端工程师喜爱的特性之一。然而,在 ES7 中,我们也可以通过一些方法来实现箭头函数的效...

    1 年前
  • TypeScript 中如何声明和使用可选参数

    在 TypeScript 中,我们经常需要声明函数的参数,并且有时这些参数是可选的,因为并不是每次调用函数时都需要传递完整的参数列表。本文将会介绍如何在 TypeScript 中声明和使用可选参数。

    1 年前
  • Webpack 开发模式下无法读取 TypeScript 文件的解决方式

    背景 在前端领域使用 TypeScript 已经是越来越普遍的趋势。随着 TypeScript 的普及,使用 Webpack 打包工具来构建前端项目也成为了大家的首选。

    1 年前
  • RxJS 在 Angular 中的应用实践详解

    RxJS 是一个基于 Observable 的异步编程框架,而 Angular 则是一个流行的前端开发框架。在 Angular 中,RxJS 被广泛应用于处理异步数据流。

    1 年前
  • 使用 Harbor 和 PM2 进行 Node.js 应用的镜像管理

    前言 随着 Node.js 在 Web 开发中的应用越来越广泛,开发和部署 Node.js 应用的方式也在不断地变化和发展。其中,使用 Docker 镜像在不同环境间保持一致性的需求也越来越大。

    1 年前

相关推荐

    暂无文章