如何使用 ECMAScript 2021 中的 Optional Chaining 进行条件判断

阅读时长 6 分钟读完

如何使用 ECMAScript 2021 中的 Optional Chaining 进行条件判断

在前端开发过程中,我们经常需要进行条件判断,而传统的判断语句显得繁琐且不够简洁。幸运的是,在 ECMAScript 2021 中引入了 Optional Chaining 这个新特性,可以更加便捷地进行条件判断。本文将为大家介绍 Optional Chaining 的用法,并以详细的示例代码来解析该特性的实现方式。

Optional Chaining 的概念

Optional Chaining,顾名思义,是一种可选的链式语法。它可以简化代码中的条件判断,避免代码中的重复性工作。通常情况下,我们都需要通过 if 语句来检查对象中是否存在某个属性。例如,我们要判断一个对象的属性 a 是否存在:

以上代码需要增加 obj 与 obj.a 的判断,判断是否存在,造成代码量过大、多余的问题。

在 ECMAScript 2021 中,我们可以使用可选链式语法,通过安全的方式调用对象的属性,即使该属性不存在,也不会导致代码出现错误。示例如下:

如果 obj 对象不存在 a 这个属性,则代码仅仅只是不去“做一些操作”的处理而已。

Optional Chaining 的使用

在实际开发中,Optional Chaining 的使用很多时候是配合箭头函数使用的,这里先简单介绍一下箭头函数(Arrow Function)。

箭头函数是 ES6 中一种简写函数的方式,它简写了函数声明的方式,同时还有自己独特的特性,比如不需要绑定 this、更加简短等。

这个,我们用箭头函数来特展示Optional Chaining的用法,需要理解一下 Demo 中的 transformData 函数原型,它一般的存在于一个上下文。

ES2021 的 Optional Chain 实现了简洁的取值方式,借助于 ?. 操作符,不但可选的属性可以被取值,同时更深层次的链会被保护。例如:

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

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

obj.person 或者 obj 不存在时,obj?.person?.ageobj?.person?.address?.country 都不会抛出 TypeError。

Optional Chaining 解决了什么问题

以上代码都有一个问题,如果在提取这些数据时,当前数据值为 null 或者 undefined 的时候,对于当前值的取值及子取值,就会产生异常及错误。Optional Chaining 此时就会帮我们解决这个问题。

实际应用

其实我们在项目中,很多时候都可以使用 Optional Chaining,最常用的是在 JSON 数据的处理上,比如从后端 API 返回的用户信息。以 transformData 函数为例,来模拟一个用户信息的 JSON 数据:

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

了解了 Optional Chaining 的实现方式后,我们可以使用 Optional Chaining 为默认值提供更好的解决方案:

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

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

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

这里我们为 phone 提供了一个默认值,因为 phoneNumbers 设置为了 null,所以就算不给默认值,第二次尝试确定值就会报 error: data.phoneNumbers[0] is undefined

总结

正是依靠 ECMAScript 2021 中新增的 Optional Chaining 特性,使我们更方便的处理对象的属性鉴定及其子属性的取值,对于多方面业务场景都提供了一种更加优美的代码处理方式。虽然目前还有许多浏览器没有完全实现此特性,但可以通过 TypeScript 等高级语言转义为相似的语法来实现。

Optional Chaining 举了一个反例:数据驱动(data-driven)应用和组件,通常都喜欢深入嵌套, 随着更“扯远”的组件导航,不用 Chain 是很难进行数据的操作和筛选的。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c09a9083d39b48814e6c03

纠错
反馈