如何处理 ES11 中的可选链操作符的 TypeError

如何处理 ES11 中的可选链操作符的 TypeError

在 ES11 中,新添加了可选链操作符(Optional Chaining Operator),可以让我们在访问一个对象时,不必担心对象不存在或者深度访问对象时会抛出 TypeError 异常。但是即使使用了可选链操作符,有时候仍然会遇到类型错误(TypeError)异常。本文将介绍可选链操作符的使用及解决 TypeError 异常。

可选链操作符的使用

可选链操作符是一个 ?,可以跟在一个对象的属性或方法调用后面,表示如果这个对象存在,就继续访问下去,如果不存在,则返回 undefined。示例如下:

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

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

在上面的代码中,obj.address?.city 表示如果 obj.address 存在,则获取其 city 属性,否则返回 undefined。而 obj.address?.country 中的 obj.address 不存在,所以直接返回 undefined。

可选链操作符可以链式使用,如下所示:

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

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

在上面的代码中,obj.address?.location?.lat 表示如果 obj.address 存在,并且它的 location 属性存在,则获取 locationlat 属性,否则返回 undefined。

TypeError 异常的解决

即使使用了可选链操作符,在访问一个未定义的属性或方法时,仍然会抛出 TypeError 异常。例如:

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

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

在上面的代码中,obj.address.country 不存在,因此访问它的 toUpperCase 方法会抛出 TypeError 异常。

解决 TypeError 异常的方法就是在使用可选链操作符时,加上对 undefined 的判断,这样可以避免访问未定义的属性或方法。例如:

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

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

在上面的代码中,obj.address?.country?.toUpperCase() 表示如果 obj.address 存在,且它的 country 存在,则将 country 转成大写字母,否则返回 undefined。

案例分析

下面通过一个实际的案例来介绍如何使用可选链操作符和处理 TypeError 异常。

假设我们有一个对象数组,其中每个对象都代表一本书的信息,包括书名、作者和出版日期。我们想要通过一个日期范围(开始日期和结束日期)来筛选出所有出版日期在该范围内的书籍。

首先,我们可以写一个筛选函数 filterBooksByDateRange,如下所示:

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

其中,books 是一个对象数组,startDateendDate 分别是开始日期和结束日期。在函数中,我们通过 filter 方法遍历每个 book,然后将 publishedDate 转成日期对象,和 startDateendDate 比较来判断这本书是否符合我们的日期范围条件。

但是,如果某个 bookpublishedDate 属性不存在,那么将抛出 TypeError 异常。我们可以使用可选链操作符来避免这个问题,代码如下所示:

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

在上面的代码中,我们使用了可选链操作符 book.publishedDate?.toString() 来获取 publishedDate 的字符串表示,如果 publishedDate 不存在,则返回 undefined。然后我们调用 new Date() 来将字符串转化为日期对象,这样即使 publishedDate 不存在,也不会抛出 TypeError 异常了。

总结

可选链操作符是一个方便的工具,能够在访问对象时避免出现未定义的属性或方法访问问题。但是在使用可选链操作符时,我们仍然要注意可能出现的 TypeError 异常,需要加上对 undefined 的判断。我们可以通过案例分析来理解和掌握可选链操作符和解决 TypeError 异常的技巧。

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


猜你喜欢

  • ES7 之 Proxy 代理详解

    前言 JavaScript 是一种弱类型语言,给编程带来了很大的灵活性,但也因此带来了一些安全性方面的问题,比如通过修改或篡改对象属性来达到非法访问或修改数据的目的,而 Proxy 是一种新的解决方案...

    9 个月前
  • React 项目优化之性能篇:Header、Footer、Content 组件优化实例剖析

    前言 在前端开发中,对于项目的优化一直是一个重要的主题。尤其在 React 项目中,由于其组件化的特性,对于每个组件的优化更是至关重要。 本文将从 Header、Footer、Content 组件三个...

    9 个月前
  • 用 Sequelize 实现 CRUD 的详细指南

    Sequelize 是一个 Node.js ORM 框架,它支持多种数据库,并且提供了非常方便的 API 使得开发人员可以方便地进行数据库操作。在本篇文章中,我们将会使用 Sequelize 实现 C...

    9 个月前
  • async/await 和 Promise 的区别

    在 JavaScript 中,异步编程是一个不可避免的话题。为了处理异步操作,JavaScript 提供了两种机制:Promise 和 async/await。它们的本质区别在于,Promise 是一...

    9 个月前
  • Sass 中使用!global 变量

    Sass 中使用 $global 变量 在前端开发的过程中,我们经常需要使用 CSS 来为网站添加样式,如颜色、字体大小和布局等等。然而,CSS 的语法比较繁琐,缺少编程语言的一些特性,例如变量、函数...

    9 个月前
  • 如何使用 ES12 中的可选链运算符处理 undefined 和 null

    在前端开发中,我们经常会处理对象的属性或方法,但是当访问一个未定义的属性时,就会出现 undefined,而在链式调用中,如果其中一个对象为 null 或 undefined,则程序将崩溃。

    9 个月前
  • CSS Flexbox 动画:实现简单的进度条效果

    在前端开发中,设计动画效果可以提高用户体验和界面交互。在本篇文章中,我们将介绍如何使用 CSS Flexbox 动画来实现简单的进度条效果。 什么是 CSS Flexbox? CSS Flexbox ...

    9 个月前
  • 利用 ES9 中的新特性批量改名变量:import() 面向可执行字符串

    ES9 提供了一种新的特性,可以让我们批量改变变量的名称。这个特性是 import(),是面向可执行字符串的。 什么是 import() 在 ES6 中,我们一般使用 import 语句来加载其他模块...

    9 个月前
  • 如何使用 Java 语言实现 RESTful API

    RESTful API 已经成为现代 Web 开发的标准。在本文中,我将向您介绍如何使用 Java 语言来实现 RESTful API。RESTful API 是一种快速、安全、可扩展的 Web AP...

    9 个月前
  • Angular i18n:多语言国际化实战

    在开发 Web 应用程序时,多语言的国际化是必不可少的。在 Angular 框架中,i18n 是一个非常有用的工具,可以帮助我们轻松地实现多语言支持。在本文中,我们将学习如何在 Angular 应用程...

    9 个月前
  • ES8 中的 Private Fields 和方法详解

    在 ES8 中,新增了一个非常神奇的特性,那就是私有属性和方法。私有属性和方法可以保证对象的内部状态不被外部直接访问或者修改,从而增强了对象的封闭性和安全性。本文将详细讲解 ES8 中的私有属性和方法...

    9 个月前
  • 基于 Server-sent Events(SSE) 的 Web 实时监测和统计系统

    在现代 Web 应用中,往往需要实时监测和统计用户行为。传统的轮询方式浪费了大量的服务器资源,而 WebSocket 又需要特殊的服务器支持。那这时候一个新的技术 Server-sent Events...

    9 个月前
  • Cypress 报错:Failed to execute 'appendChild' on 'Node' 的解决方法

    问题描述 在使用 Cypress 进行前端自动化测试时,有可能会遇到以下报错信息: ------ -- ------- ------------- -- ------- --------- - -- ...

    9 个月前
  • MySQL 性能优化:并发访问下 InnoDB 性能提升指南

    MySQL 是目前最常用的关系型数据库之一,但是随着业务的增长,MySQL 的性能问题开始变得越来越明显。其中,并发访问是 MySQL 性能瓶颈的主要原因之一。而 InnoDB 是 MySQL 中最常...

    9 个月前
  • 在 ES11 中使用 dynamic import 进行模块懒加载的技巧和技巧

    随着现代 Web 应用的发展,前端代码的体量越来越大,对于用户来说,加载时间也成为了非常关键的因素。为了提升用户的体验,前端技术不断地在优化加载和运行的速度和效率。

    9 个月前
  • Express.js 如何优雅地处理 JSONP 请求

    Express.js 如何优雅地处理 JSONP 请求 在前端开发中,跨域请求是常见的需求。而JSONP(JSON with Padding)是实现跨域请求的一种常见方式。

    9 个月前
  • Sass 中的 @if、@else if、@else 语句详解

    Sass 是一种预编译样式表语言,它提供了比原生的 CSS 更多的工具和函数,让前端工程师可以更快速、更高效地开发和管理 CSS。 在 Sass 中,我们可以使用一系列的控制语句,比如 @if、@el...

    9 个月前
  • 如何在 Koa2 中处理 HTTP 请求参数

    在前端开发中,我们经常需要在服务器端处理 HTTP 请求参数,下面我将介绍如何在 Koa2 中处理这些参数,来满足不同需求的多样化场景。 理解 HTTP 请求参数 HTTP 请求参数是指客户端向服务器...

    9 个月前
  • 熟悉一下 flexbox 布局的 16 个常用属性

    Flexbox 是一种弹性布局模型,它为设计者提供了强大的布局能力,特别是在响应式设计中。Flexbox 的设计思路是让容器能够根据内容自动调整内部子元素的大小和布局。

    9 个月前
  • Socket.io 如何设置不同的房间权限

    前言 Socket.io 是一种实时网络通信协议,常用于开发实时通信应用,如聊天室、多人游戏等。在构建这样的应用时,我们需要为不同房间设置不同的权限,以便控制用户的访问权限。

    9 个月前

相关推荐

    暂无文章