点击上方“前端自习课”关注,学习起来~

对象和数组时 Javascript 中最常用的两种数据结构,由于 JSON 数据格式的普及,二者已经成为 Javascript 语言中特别重要的一部分。在编码过程中,我们经常定义许多对象和数组,然后有组织地从中提取相关的信息片段。ES6 中添加了可以简化这种任务的新特性:解构。解构是一种打破数据结构,将其拆分为更小部分的过程。

为什么需要解构

我们考虑一个大多数人在使用 Javascript 进行编码时可能遇到过的情况。

假设,我们有一个学生数据,在学生数据中用一个对象表示三个学科(数学、语文、英语)的分数,我们根据这些数据显示学生的分数信息:

使用上面的代码,我们将获得所需的结果。但是,以这种方式编写的代码需要有一些值得注意的地方。由于我们访问的对象 scores 嵌套在另一个对象 student 中,所以,我们的访问链变得更长,这意味着更多的输入, 而由于更多的输入,也就更有可能造成拼写的错误。当然,这并不是什么大问题,但是通过解构,我们可以用更具有表现力 和更紧凑的语法来做同样的事情。

对象的解构赋值

对象解构的语法形式是在一个赋值操作符左边放置一个对象字面量,例如:

这段代码中 details.firstName 的值被存储在变量 firstName 中,details.age 的值被存储在变量 age 中。这是对象解构的最基本形式。

用一张图来解释一下其中的解构过程:

非同名变量赋值

在这个例子中,我们使用与对象属性名相同的变量名称,当然,我们也可以定义与属性名不同的变量名称:

在这里,我们创建了两个局部变量:fullname , place,并将 fullname 映射到 name,place映射到 country。

默认值

使用解构赋值表达式时,如果指定的局部变量名称在对象中不存在,那么这个局部变量会被赋值为 undefined,就像这样:

这段代码额外定义了一个局部变量 age,然后尝试为它赋值,然而在 person 对象上,没有对应属性名称的属性值,所以它像预期中的那样赋值为 undefined。

当指定的属性不存在时,可以定义一个默认值,在属性名称后添加一个等号(=)和相应的默认值即可:

在这个例子中,为变量 age 设置了默认值 20,为非同名变量 sex 设置了默认值 male。只有对象 person 上没有该属性或者属性值为 undefined 时该默认值才生效。

嵌套对象的解构赋值

解构嵌套对象仍然与对象字面量的语法相似,可以将对象拆解以获取你想要的信息。

再来看文中最开始的例子,我们有一个学生数据,在学生数据中用一个对象表示三个学科(数学、语文、英语)的分数,我们根据这些数据显示学生的分数信息。我们可以通过解构赋值优雅的对其进行操作:

在这里,我们定义了四个局部变量:name、math、chinese、english。此外我们还为变量 math、chinese、english 分别指定了默认值。

数组的解构赋值

与对象解构的语法相比,数组解构就简单多了,它使用的是数组字面量,且解构操作全部在数组内完成,而不是像对象字面量语法一样使用对象的命名属性。

在上面的代码中,我们从数组 list 中解构出数组索引 0 和 1 所对应的值并分别存储至变量 houseNo 和 street 中。

在数组的解构中,也可以直接省略元素,只为需要的元素提供变量名:

这段代码中使用解构语法从数组 list 中获取索引 0 和索引 2 所对应的元素,city 前的逗号是前方元素的占位符,无论数组中的元素有多少个,都可用这种方式来提取想要的元素。

用一张图来解释一下其中的解构过程:

默认值

在数组的解构赋值表达式中也可以为数组的任意位置添加默认值,当指定位置的属性不存在或其值为 undefined 时使用默认值:

上面代码中,数组 list 只有两个元素,变量 city 没有对应的匹配值,但有一个默认值 BJ,所以最终 city 的输出结果不是 undefined 而是默认值 BJ。

嵌套数组的解构赋值

就像对象一样,也可以对嵌套数组进行解构操作,在原有的数组解构模式中插入另一个数组解构模式,即可将解构过程深入到下一级:

在这个例子中,我们通过数组的嵌套解构,为变量 firstColor 和 secondColor 分配对应的值。

不定元素

在数组中,可以通过...语法将数组中的其余元素赋值给一个特定的变量,就像这样:

这个例子中,数组 colors 的第一个元素被赋值给了 firstColor ,其他元素被赋值给了 otherColors 数组,所以 otherColors 中包含两个元素:'green' 和 'blue'。

混合解构

可以混合使用对象解构和数组解构来构建更多复杂的表达式,如此一来可以从任何混杂着对象和数组的数据结构中提取你想要的信息。

当使用混合解构语法时,可以从 node 对象中提取任意想要的信息。

混合解构这种方式对于从 JSON 中提取数据时尤其有效,不再需要遍历整个解构了。

作者:云中桥

链接:https://juejin.im/post/5d02f267f265da1bb776648b

如果您觉得本文不错,

请点击文章底部广告,支持一下我啦!

原创系列推荐

1. JavaScript 重温系列(22篇全)

2. ECMAScript 重温系列(10篇全)

3. JavaScript设计模式 重温系列(9篇全)

4. 正则 / 框架 / 算法等 重温系列(16篇全)

5. Webpack4 入门手册(共 18 章)(上)

6. Webpack4 入门手册(共 18 章)(下)

7. 59篇原创系列汇总

点这,与大家一起分享本文吧~

【JS】325- 深度理解ES6中的解构赋值的更多相关文章

  1. ES6中的解构赋值

    在解释什么是解构赋值前,我们先来看一下, ES5 中对变量的声明和赋值. var str = 'hello word'; 左边一个变量名,右边可以是字符串,数组或对象. ES6 中增加了一种更为便捷的 ...

  2. ES6里的解构赋值

    我们经常定义许多对象和数组,然后有组织地从中提取相关的信息片段.在ES6中添加了可以简化这种任务的新特性:解构.解构是一种打破数据结构,将其拆分为更小部分的过程. 一.引入背景 在ES5中,开发者们为 ...

  3. ES6 变量的解构赋值

    数组的解构赋值     var [a,b,c] = [1,2,3];    左边是变量,右边是值,根据数据结构一一对应 只要等号两边的模式相同,左边的变量就会被赋予右边对应的值,必须模式相同 如果等号 ...

  4. 深入理解ES6之—数据解构

    一 对象解构 对象解构语法在赋值语句的左侧使用了对象字面量 let node = { type: true, name: false } //既声明又赋值 let { type, name } = n ...

  5. ES6中的解构

    数组中的解构: 输出 : 白板 幺鸡 二条 对象的解构: 输出: 老王 12 数组的结构用[];对象的解构用{}:一定要区分它是数组还是解构. 区分方法:看 它是在赋值还是在拿值,等号左边,都为解构, ...

  6. ES6的变量解构赋值

      前  言 ES6 解构赋值: ES6允许按照一定模式从数组和对象中提取值,然后对变量进行赋值,这被称为解构. 1.1 数组的结构赋值 1.1.1基本用法 JS中,为变量赋值直接指定.例如下面代码: ...

  7. ES6学习之 解构赋值

    最近看了一个vue的项目,发现作者大量使用了ES6的语法,包括async, Promise, Set, Map还有一些解构赋值, 才发现自己对于ES6的语法缺乏了总结和运用,看得有点艰难,所以重新学习 ...

  8. ES6基础与解构赋值(高颜值弹框小案例!)

    let只作用在当前块级作用域内使用let或者const声明的变量,不能再被重新声明let不存在`变量提升` console.log(dad); var dad = '我是爸爸!';//预定义undef ...

  9. ES6学习-4 解构赋值(1)数组的解构赋值

    解构赋值是ES6很大的一个提升,为我们带来了很多方便,但用不好,会使程序的可读性变差,所以用时要注意,尽量保持程序的易读性. 数组解构赋值 在JS没有支持解构赋值之前,我们声明几个变量并赋值通常都是像 ...

随机推荐

  1. pat 1100 Mars Numbers(20 分)

    1100 Mars Numbers(20 分) People on Mars count their numbers with base 13: Zero on Earth is called &qu ...

  2. pat 1011 World Cup Betting(20 分)

    1011 World Cup Betting(20 分) With the 2010 FIFA World Cup running, football fans the world over were ...

  3. MySQL 5.7 安装教程(Win 10)

    MySQL5.7 下载 官网下载(不推荐使用):https://dev.mysql.com/downloads/mysql/ 清华镜像站下载(推荐):https://mirrors.tuna.tsin ...

  4. 【接口测试】HttpClient+fastJson 总结与案例

    多次理解,反复练习,破釜沉舟. HttpCLient是什么 Apache Jakarta Common 下的子项目 支持 HTTP 协议的客户端编程工具包 支持 HTTP 协议最新的版本 怎么利用Ht ...

  5. JavaScript中解析JSON --- json.js 、 json2.js 以及 json3.js的使用区别

    JSON官方(http://www.json.org/)提供了一个json.js,json.js是JSON官方提供的在JavaScript中解析JSON的js包,json.js.json2.js.js ...

  6. windows下大数据开发环境搭建(1)——Hadoop环境搭建

    所需环境 jdk 8 Hadoop下载 http://hadoop.apache.org/releases.html 配置环境变量 HADOOP_HOME: C:\hadoop-2.7.7 Path: ...

  7. 在SQL Server数据库中执行存储过程很快,在c#中调用很慢的问题

    记录工作中遇到的问题,分享出来: 原博客地址:https://blog.csdn.net/weixin_40782680/article/details/85038281 今天遇到一个比较郁闷的问题, ...

  8. 扛把子组作业要求 20191024-3 互评Alpha阶段作品

    此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2019fall/homework/9860] 组名:扛把子 组长:迟俊文 组员:宋晓丽 梁梦瑶 韩昊 刘信鹏 ...

  9. 探索 IPv6 网络

    目录 0x00 前言 0x01 探索 服务器配置 IPv6 地址 服务器部署网络代理 客户端配置网络代理 测试访问 IPv6 地址 给博客添加 IPv6 地址 0x00 前言 IPv4 地址枯竭的事情 ...

  10. Spring中,多个service发生嵌套,事务是怎么样的?

    前言 最近在项目中发现了一则报错:"org.springframework.transaction.UnexpectedRollbackException: Transaction roll ...