热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解构给默认值_使用JavaScript解构让代码更优雅

茫茫人海中与你相遇相信未来的你不会很差原作者:JuanCruzMartinez原文链接:WriteCleanerCodebyUsingJavaScrip

茫茫人海中与你相遇

fb5e0bb37b844d2b41700bcd7df47f84.png

相信未来的你不会很差

原作者:Juan Cruz Martinez

原文链接:Write Cleaner Code by Using Javascript Destructuring

译者:zenblo

来源:https://juejin.cn/post/6901081096260648974#heading-0

解构是我最喜欢的 Javascript 特性之一。简单地说,解构可以将复杂结构(如数组或对象)分解为更简单的部分,虽然还有很多内容,但是相对简化了代码结构。

让我们通过一个例子来更好地了解:

const article = { title: "My Article", rating: 5, author: { name: "Juan", twitter: "@bajcmartinez" }}// 现在把它打印出来console.log(`"${article.title}" by ${article.author.name} had ${article.rating} stars`)// 通过使用解构同样能完成const { title, rating, author: { name } } = articleconsole.log(`"${title}" by ${name} had ${rating} stars`)------------------------Output------------------------"My Article" by Juan had 5 stars"My Article" by Juan had 5 stars现在,一部分人已经采用解构开发了一段时间,或许是在构建 React 应用时候,但是他们并不完全了解它。对其他人来说,这可能是第一次用到解构。因此,本文将从头到尾完成整个过程,最终使得大家对解构的认知都能达到同一水平。

解构对象

在上面的例子中,所有隐藏的内容都发生在下面这行代码:

const { title, rating, author: { name } } = article

现在,在表达式左侧使用这样的大括号似乎有点奇怪,但这就是我们告诉 Javascript 正在分解对象的方式。

解构对象可以绑定到对象里的任一层级的任何属性上。让我们从一个更简单的示例开始:

const me = { name: "Juan"}const { name } = me在上面的例子中,我们声明了一个名为 name的变量,该变量将从对象 me中获得相同名称的初始化属性,因此当我们对 name求值时,我们得到 Juan。太棒了!这个操作同样适用于任意层级的属性。回到我们的例子:

const { title, rating, author: { name } } = article对于 title和 rating,和我们之前的讲解一样。但是在 author这里,事情有点不同。当我们遇到一个是对象或数组的属性时,我们可以选择是创建一个变量author的引用对象 article.author,或者进行深度解构并立即访问内部对象的属性。访问对象属性:

const { author } = articleconsole.log(author.name)------------------------Output------------------------Juan执行深度或嵌套解构:

const { author: { name } } = articleconsole.log(name)console.log(author)------------------------Output------------------------JuanUncaught ReferenceError: author is not defined上面的示例怎么回事?如果解构了 author,但是它为什么没有被定义?其实挺简单的。当我们要求 Javascript 也对 author对象进行解构时,绑定本身并没有被创建,取而代之的是我们可以访问我们选择的所有author属性,请记住这点。扩展运算符(...):

const article = { title: "My Article", rating: 5, author: { name: "Juan", twitter: "@bajcmartinez"const { title, ...others } = articleconsole.log(title)console.log(others)------------------------Output------------------------My Article> {rating: 5, author: {name: "Juan", twitter: "@bajcmartinez" }}

此外,我们可以使用扩展运算符 ... 创建一个包含所有未被解构属性的对象。

如果你有兴趣了解更多关于扩展运算符的知识,请查看我的文章。

重命名属性

解构的一个重要特性是:能够为我们提取的属性选择不同的变量名。让我们看看下面的例子:

const me = { name: "Juan" }const { name: myName } = meconsole.log(myName)------------------------Output------------------------Juan通过在一个属性上使用 :我们可以为它提供一个新的名称(在我们的例子中是 newName)。然后我们可以在代码中访问这个变量。需要注意的是,原始属性 name的变量并没有被定义。

缺少属性

那么,如果我们试图解构一个没有在对象中定义的属性,会发生什么呢?

const { missing } = {}console.log(missing)------------------------Output------------------------undefined在这种情况下,变量的值是 undefined

默认值

扩展缺失的属性,当属性不存在时,可以指定一个默认值。让我们来看一些例子:

const { missing = "missing default" } = {}const { someUndefined = "undefined default" } = { someUndefined: undefined }const { someNull = "null default" } = { someNull: null }const { someString = "undefined default" } = { someString: "some string here" }console.log(missing)console.log(someUndefined)console.log(someNull)------------------------Output------------------------missing defaultundefined defaultnullsome string here这些都是解构对象赋值的例子,默认值仅在属性 undefined分配。例如,如果属性的值为 null或 string,则不会分配默认值,但属性的实际值会被分配。

解构数组和可迭代对象

我们已经看到了一些解构对象的例子,但是同样的例子也适用于数组或可迭代对象。让我们从一个例子开始:

const arr = [1, 2, 3]const [a, b] = arrconsole.log(a)console.log(b)------------------------Output------------------------12当我们需要解构一个数组时,我们需要使用 []而不是 {},我们可以用不同的变量映射数组的每个位置。但是也有一些不错的方法:

跳过元素

通过使用 , 运算符,我们可以跳过可迭代数据项中的一些元素,如下所示:

const arr = [1, 2, 3]const [a,, b] = arrconsole.log(a)console.log(b)------------------------Output------------------------13请注意,在 ,之间留一个空格会跳过元素。这是小细节,但对结果有很大影响。你还能做什么?你也可以使用扩展运算符 ...进行如下操作:

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]const [a,, b, ...z] = arrconsole.log(a)console.log(b)console.log(z)------------------------Output------------------------13(7) [4, 5, 6, 7, 8, 9, 10]在这种情况下,z将获得 b之后的所有值成为数组。或者你有一个更具体的需求,你想在数组中的特定位置解构。没问题,Javascript 依然可以做到:

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]const { 4: fourth, 9: ninth } = arrconsole.log(fourth)console.log(ninth)------------------------Output------------------------510如果我们把一个数组当作一个对象来解构,我们可以把索引作为属性,来访问数组中的任何位置的值。

缺少属性

与对象的情况一样,也可以为数组中未定义的元素设置默认值。让我们看一些例子:

const [missing = 'default missing'] = []const [a, b, c = "missing c", ...others] = [1, 2]console.log(missing)console.log(a)console.log(b)console.log(c)console.log(others)------------------------Output------------------------default missing12missing c[]当解构数组时,也可以为 undefined属性设置默认值。但是,当我们使用扩展运算符...时,则不能为变量设置默认值。在使用 ...解构 undefined时,它将返回一个空数组:

交换变量

这是一个有趣的解构示例。在一个表达式中可以交换两个变量:

let a = 1let b = 5[a, b] = [b, a]console.log(a)console.log(b)------------------------Output------------------------51

使用计算属性进行解构

直到现在,任何时候我们想要解构一个对象的属性或者一个可迭代的元素,我们都使用静态键。如果我们想要动态键(比如存储在变量中的键),我们需要使用计算属性:

这里有一个示例:

const me = { name: "Juan" }let dynamicVar = 'name'let { [dynamicVar]: myName } = meconsole.log(myName)------------------------Output------------------------Juan通过在 []中使用变量,我们可以在赋值之前计算它的值。因此,尽管必须为该新变量提供名称,但可以进行动态解构。

解构函数参数

解构变量可以在我们声明变量的任何地方使用(例如,通过使用 letconst 或 var),也可以解构函数参数。这是一个简单的示例:

const me = { name: "Juan" }function printName({ name }) { console.log(name)}printName(me)------------------------Output------------------------Juan

非常简单。此外,我们之前讨论过的所有规则都适用。

结论

在开始使用解构时可能会不舒服,但一旦你习惯了,就再也回不去了。它真的可以让你的代码更简洁,这是一个需要了解的概念。

71aa528ee27c5355bb05cae940e443c9.png

我们在虚拟的空间与你相遇,期待可以碰撞出不一样的火花

7c2d90d4100b060a8bd8b562e1018d58.png8bee448e0c5b6899c07d96f25a637823.png公众号ID:前端大联盟扫码关注最新动态


推荐阅读
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • React基础篇一 - JSX语法扩展与使用
    本文介绍了React基础篇一中的JSX语法扩展与使用。JSX是一种JavaScript的语法扩展,用于描述React中的用户界面。文章详细介绍了在JSX中使用表达式的方法,并给出了一个示例代码。最后,提到了JSX在编译后会被转化为普通的JavaScript对象。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 本文提供了成为成功软件工程师的7条建议,包括不要低估自己、公司需要你、投资自己等。通过学习新技术、提升编码技能,软件工程师可以获得更好的职业机会和更高的薪水,同时也增强自信。投资自己是取得成功的关键。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文介绍了如何在Azure应用服务实例上获取.NetCore 3.0+的支持。作者分享了自己在将代码升级为使用.NET Core 3.0时遇到的问题,并提供了解决方法。文章还介绍了在部署过程中使用Kudu构建的方法,并指出了可能出现的错误。此外,还介绍了开发者应用服务计划和免费产品应用服务计划在不同地区的运行情况。最后,文章指出了当前的.NET SDK不支持目标为.NET Core 3.0的问题,并提供了解决方案。 ... [详细]
  • Jboss的EJB部署描述符standardjaws.xml配置步骤详解
    本文详细介绍了Jboss的EJB部署描述符standardjaws.xml的配置步骤,包括映射CMP实体EJB、数据源连接池的获取以及数据库配置等内容。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
author-avatar
清新的淡淡茶绿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有