广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >JavaScript可选链是什么
  • 789
分享到

JavaScript可选链是什么

2024-04-02 19:04:59 789人浏览 泡泡鱼
摘要

本篇内容主要讲解“javascript可选链是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript可选链是什么”吧!1. 问题由于 JavaS

本篇内容主要讲解“javascript可选链是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript可选链是什么”吧!

1. 问题

由于 JavaScript 的动态特性,一个对象可以具有非常不同的对象嵌套结构。

通常,你可以在以下情况下处理此类对象:

  • 获取远程JSON数据

  • 使用配置对象

  • 具有可选属性

尽管这为对象提供了支持不同数据的灵活性,但是在访问此类对象的属性时,随之而来的是增加了复杂性。

biGobject 在运行时可以有不同的属性集:

// One version of bigObject const bigObject = {   // ...   prop1: {     //...     prop2: {       // ...       value: 'Some value'     }   } };  // Other version of bigObject const bigObject = {   // ...   prop1: {     // Nothing here      } };

因此你必须手动检查属性是否存在:

// Later if (bigObject &&      bigObject.prop1 != null &&      bigObject.prop1.prop2 != null) {   let result = bigObject.prop1.prop2.value; }

最好不要这样写,因为包含了太多的样板代码。。

让我们看看可选链是如何解决此问题,从而减少样板条件的。

2. 轻松深入访问属性

让我们设计一个保存电影信息的对象。该对象包含 title 必填属性,以及可选的 director 和 actor。

movieSmall 对象仅包含 title,而 movieFull 则包含完整的属性集:

const movieSmall = {   title: 'Heat' };  const movieFull = {   title: 'Blade Runner',   director: { name: 'Ridley Scott' },   actors: [{ name: 'Harrison Ford' }, { name: 'Rutger Hauer' }] };

让我们写一个获取导演姓名的函数。请注意 director 属性可能会丢失:

function getDirector(movie) {   if (movie.director != null) {     return movie.director.name;   } }  getDirector(movieSmall); // => undefined getDirector(movieFull);  // => 'Ridley Scott'

if (movie.director) {...} 条件用于验证是否定义了 director 属性。如果没有这种预防措施,则在访问movieSmall  对象的导演的时,JavaScript 会引发错误 TypeError: Cannot read property 'name' of  undefined。

这是用了可选链功能并删除 movie.director 存在验证的正确位置。新版本的 getDirector() 看起来要短得多:

function getDirector(movie) {   return movie.director?.name; }  getDirector(movieSmall); // => undefined getDirector(movieFull);  // => 'Ridley Scott'

在 movie.director?.name 表达式中,你可以找到 ?.:可选链运算符。

对于 movieSmall,缺少属性 director。结果 movie.director?.name 的计算结果为  undefined。可选链运算符可防止引发 TypeError: Cannot read property 'name' of undefined  错误。

相反 movieFull 的属性 director是可用的。 movie.director?.name 默认被评估为 'Ridley  Scott'。

简而言之,代码片段:

let name = movie.director?.name;

等效于:

let name; if (movie.director != null) {   name = movie.director.name; }

?. 通过减少两行代码简化了 getDirector() 函数。这就是为什么我喜欢可选链的原因。

2.1 数组项

可选链能还可以做更多的事。你可以在同一表达式中自由使用多个可选链运算符。甚至可以用它安全地访问数组项!

下一个任务编写一个返回电影主角姓名的函数。

在电影对象内部,actor 数组可以为空甚至丢失,所以你必须添加其他条件:

function getLeadingActor(movie) {   if (movie.actors && movie.actors.length > 0) {     return movie.actors[0].name;   } }  getLeadingActor(movieSmall); // => undefined getLeadingActor(movieFull);  // => 'Harrison Ford'

如果需要 if (movie.actors && movies.actors.length > 0) {...} ,则必须确保  movie 包含 actors 属性,并且该属性中至少有一个 actor。

使用可选链,这个任务就很容易解决:

function getLeadingActor(movie) {   return movie.actors?.[0]?.name; }  getLeadingActor(movieSmall); // => undefined getLeadingActor(movieFull);  // => 'Harrison Ford'

actors?. 确保 actors 属性存在。 [0]?. 确保列表中存在第一个参与者。这真是个好东西!

3. 默认为Nullish合并

一项名为nullish 合并运算符的新提案会处理 undefined 或 null ,将其默认设置为特定值。

如果 variable 是 undefined 或 null,则表达式 variable ?? defaultValue 的结果为  defaultValue。否则,表达式的计算结果为 variable 值。

const noValue = undefined; const value = 'Hello';  noValue ?? 'Nothing'; // => 'Nothing' value   ?? 'Nothing'; // => 'Hello'

当链评估为 undefined 时,通过将默认值设置为零,Nullish 合并可以改善可选链。

例如,让我们更改 getLeading() 函数,以在电影对象中没有演员时返回 "Unknown actor" :

function getLeadingActor(movie) {   return movie.actors?.[0]?.name ?? 'Unknown actor'; }  getLeadingActor(movieSmall); // => 'Unknown actor' getLeadingActor(movieFull);  // => 'Harrison Ford'

4. 可选链的3种形式

你可以通过以下 3 种形式使用可选链。

第一种形式的 object.property 用于访问静态属性:

const object = null; object?.property; // => undefined

第二种形式 object?.[expression] 用于访问动态属性或数组项:

const object = null; const name = 'property'; object?.[name]; // => undefined
const array = null; array?.[0]; // => undefined

最后,第三种形式 object?.([arg1, [arg2, ...]]) 执行一个对象方法:

const object = null; object?.method('Some value'); // => undefined

如果需要,可以将这些形式组合起来以创建长的可选链:

const value = object.maybeUndefinedProp?.maybeNull()?.[propName];

5.短路:在null/undefined 处停止

可选链运算符的有趣之处在于,一旦在其左侧 leftHandSide?.rightHandSide  上遇到空值,就会停止对右侧访问器的评估。这称为短路。

看一个例子:

const nothing = null; let index = 0;  nothing?.[index++]; // => undefined index;              // => 0

nothing 保留一个空值,因此可选链立即求值为 undefined,并跳过右侧访问器的求值。因为 index 的值没有增加。

6. 何时使用可选链

要抵制使用可选链运算符访问任何类型属性的冲动:这会导致错误的用法。下一节将说明何时正确使用它。

6.1 可能无效的访问属性

必须仅在可能为空的属性附近使用 ?.: maybeNullish?.prop。在其他情况下,请使用老式的属性访问器:.property 或  [propExpression]。

调用电影对象。查看表达式 movie.director?.name,因为 director 可以是 undefined,所以在 director  属性附近使用可选链运算符是正确的。

相反,使用 ?. 访问电影标题 movie?.title 没有任何意义。电影对象不会是空的。

// Good function logMovie(movie) {   console.log(movie.director?.name);   console.log(movie.title); }  // Bad function logMovie(movie) {   // director needs optional chaining   console.log(movie.director.name);    // movie doesn't need optional chaining   console.log(movie?.title); }

6.2 通常有更好的选择

以下函数 hasPadding() 接受具有可选 padding 属性的样式对象。 padding 具有可选的属性  left,top,right,bottom。

尝试用可选链运算符:

function hasPadding({ padding }) {   const top = padding?.top ?? 0;   const right = padding?.right ?? 0;   const bottom = padding?.bottom ?? 0;   const left = padding?.left ?? 0;   return left + top + right + bottom !== 0; }  hasPadding({ color: 'black' });        // => false hasPadding({ padding: { left: 0 } });  // => false hasPadding({ padding: { right: 10 }}); // => true

虽然函数可以正确地确定元素是否具有填充,但是为每个属性使用可选链是毫无必要的。

更好的方法是使用对象散布运算符将填充对象默认为零值:

function hasPadding({ padding }) {   const p = {     top: 0,     right: 0,     bottom: 0,     left: 0,     ...padding   };   return p.top + p.left + p.right + p.bottom !== 0; }  hasPadding({ color: 'black' });        // => false hasPadding({ padding: { left: 0 } });  // => false hasPadding({ padding: { right: 10 }}); // => true

我认为这一版本的 hasPadding() 可读性更好。

7. 我为什么喜欢它?

我喜欢可选链运算符,因为它允许轻松地从嵌套对象中访问属性。它可以防止编写针对访问者链中每个属性访问器上的空值进行验证的样板代码。

当可选链与空值合并运算符结合使用时,可以得到更好的结果,从而更轻松地处理默认值。

到此,相信大家对“JavaScript可选链是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: JavaScript可选链是什么

本文链接: https://www.lsjlt.com/news/85329.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript可选链是什么
    本篇内容主要讲解“JavaScript可选链是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript可选链是什么”吧!1. 问题由于 JavaS...
    99+
    2022-10-19
  • JavaScript中的可选链怎么使用
    这篇文章主要介绍“JavaScript中的可选链怎么使用”,在日常操作中,相信很多人在JavaScript中的可选链怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript中的可选链怎么使用...
    99+
    2023-07-06
  • JavaScript中可选链(?.)用法示例详解
    目录简介和其它相似方法的区别总结简介 在JavaScript中,我们经常需要处理JSON数据对象,而JSON数据对象的层级较深,处理其属性值时就会显得较为麻烦,此时可选链(Opti...
    99+
    2023-05-16
    JavaScript可选链(?.) JavaScript 可选链用法
  • JavaScript原型链是什么
    这篇文章主要为大家展示了“JavaScript原型链是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript原型链是什么”这篇文章吧。1、构造函数和实例假设你声明一个方法叫做Fo...
    99+
    2023-06-25
  • JavaScript作用域链是什么
    本篇内容介绍了“JavaScript作用域链是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!作用域1....
    99+
    2022-10-19
  • 如何在JavaScript中使用可选链操作符
    这篇文章将为大家详细讲解有关如何在JavaScript中使用可选链操作符,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。可选链操作符(.)语法obj.propobj.[expr]func.(a...
    99+
    2023-06-15
  • javascript中的原型链是什么
    本篇内容主要讲解“javascript中的原型链是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“javascript中的原型链是什么”吧! ...
    99+
    2022-10-19
  • JavaScript原型链指的是什么
    这篇文章主要为大家展示了“JavaScript原型链指的是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript原型链指的是什么”这篇文章吧。1...
    99+
    2022-10-19
  • 什么是区块链?用php可以写区块链不?
    区块链是近年来非常热门的一个话题,它被广泛认为是未来数字化时代中不可少的一个技术。而PHP是最流行的 Web 开发语言之一,被用来构建包括社交网络、电子商务网站以及各种 Web 应用程序。那么问题来了:PHP 可以用来写区块链吗?这篇文章将...
    99+
    2023-05-14
    php
  • JavaScript原型链的原理是什么
    这篇文章主要讲解了“JavaScript原型链的原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript原型链的原理是什么”吧!解析原型...
    99+
    2022-10-19
  • JavaScript原型与原型链是什么
    这篇文章主要介绍“JavaScript原型与原型链是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript原型与原型链是什么”文章能帮助大家解决问题...
    99+
    2022-10-19
  • JavaScript的选择器是什么
    这篇文章主要讲解了“JavaScript的选择器是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript的选择器是什么”吧! ...
    99+
    2022-10-19
  • JavaScript中原型和原型链是什么
    本篇文章给大家分享的是有关JavaScript中原型和原型链是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。而原型、原型链就是其中之一。每...
    99+
    2022-10-19
  • JavaScript 中方法链的作用是什么
    本篇文章给大家分享的是有关JavaScript 中方法链的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。方法链的例子在处理字符串时有...
    99+
    2022-10-19
  • JavaScript的继承和原型链是什么
    小编给大家分享一下JavaScript的继承和原型链是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、前言JavaScri...
    99+
    2022-10-19
  • javascript的原型和原型链是什么
    小编给大家分享一下javascript的原型和原型链是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2022-10-19
  • JavaScript作用域链是什么及怎么使用
    这篇文章主要介绍了JavaScript作用域链是什么及怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript作用域链是什么及怎么使用文章都会有所收获,下面我们一起来看看吧。1. 作用域是什么...
    99+
    2023-07-04
  • JavaScript中的原型和原型链是什么
    这篇文章主要介绍“JavaScript中的原型和原型链是什么”,在日常操作中,相信很多人在JavaScript中的原型和原型链是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript中的原型和...
    99+
    2023-06-21
  • J2ME可选包中PIM用法是什么
    本篇文章给大家分享的是有关J2ME可选包中PIM用法是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。你对J2ME可选包&mdash...
    99+
    2022-10-19
  • Javascript的原型和原型链是什么意思
    这篇文章主要介绍Javascript的原型和原型链是什么意思,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、为什么要使用原型?怎样去理解原型的出现1、对象字面量创建对象的缺点想要介绍原型,就不得不提为什么我们要使用...
    99+
    2023-06-29
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作