对象和数组时 Javascript 中最常用的两种数据结构,由于 JSON 数据格式的普及,二者已经成为 Javascript 语言中特别重要的一部分。

在编码过程中,我们经常定义许多对象和数组,然后有组织地从中提取相关的信息片段。

ES6 中添加了可以简化这种任务的新特性:解构。解构是一种打破数据结构,将其拆分为更小部分的过程。

为什么需要解构

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

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

  1. const student = {
  2. name:'jsPool',
  3. age:20,
  4. scores:{
  5. math:95,
  6. chinese:98,
  7. english:93
  8. }
  9. }
  10. function showScore(student){
  11. console.log('学生名:' + student.name);
  12. console.log('数学成绩:' + (student.scores.math || 0 ));
  13. console.log('语文成绩:' + (student.scores.chinese || 0 ));
  14. console.log('英语成绩:' + (student.scores.english || 0 ));
  15. }
  16. showScore(student)
使用上面的代码,我们将获得所需的结果。但是,以这种方式编写的代码需要有一些值得注意的地方。
由于我们访问的对象 scores 嵌套在另一个对象 student 中,所以,我们的访问链变得更长,这意味着更多的输入, 而由于更多的输入,也就更有可能造成拼写的错误。
当然,这并不是什么大问题,但是通过解构,我们可以用更具有表现力 和更紧凑的语法来做同样的事情。

对象的解构赋值

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

  1. let details = {
  2. firstName:'Code',
  3. lastName:'Burst',
  4. age:22
  5. }
  6. const {firstName,age} = details;
  7.  
  8. console.log(firstName); // Code
  9. console.log(age); // 22

这是对象解构的最基本形式。

非同名变量赋值

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

  1. const person = {
  2. name: 'jsPool',
  3. country: 'China'
  4. };

  5. const {name:fullname,country:place} = person;
  6.  
  7. console.log(fullname); // jsPool
  8. console.log(place); // China

嵌套对象的解构赋值

我们可以通过解构赋值优雅的对其进行操作:

  1. const student = {
  2. name:'jsPool',
  3. age:20,
  4. scores:{
  5. math:95,
  6. chinese:98,
  7. english:93
  8. }
  9. }
  10. function showScore(student){
  11. const { name,scores:{ math = 0,chinese = 0, english = 0}} = student;
  12. console.log('学生名:' + name);
  13. console.log('数学成绩:' + math);
  14. console.log('语文成绩:' + chinese);
  15. console.log('英语成绩:' + english);
  16. }
  17. showScore(student)

数组的解构赋值

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

  1. let list = [221,'Baker Street','London'];
  2. let [houseNo,street] = list;
  3. console.log(houseNo,street);// 221 , Baker Street
  1. let list = [221,'Baker Street','London'];
  2. let [houseNo,,city] = list;
  3. console.log(houseNo,city);// 221 , London

嵌套数组的解构赋值

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

  1. let colors = [ 'red' , [ 'green' , 'yellow' ] , 'blue' ];
  2. let [ firstColor , [ secondColor ] ] = colors;
  3. console.log(firstColor,secondColor); // red , green

不定元素

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

  1. let colors = ['red','green','blue'];
  2. let [firstColor,...otherColors] = colors;
  3. console.log(firstColor); // red
  4. console.log(otherColors); // ['green','blue']

混合解构

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

  1. let node = {
  2. name:'foo',
  3. loc:{
  4. start:{
  5. line:1,
  6. column:1
  7. }
  8. },
  9. range:[0,3]
  10. }
  11. let {
  12. loc:{start:{line}},
  13. range:[startIndex]
  14. } = node;
  15. console.log(line); // 1
  16. console.log(startIndex); // 0

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

ES6必知,变量的结构赋值。的更多相关文章

  1. JS ES6的变量的结构赋值

    变量的结构赋值用户很多 1.交换变量的值 let x = 1; let y = 2; [x,y] = [y,x] 上面的代码交换变量x和变量y的值,这样的写法不仅简洁,易读,语义非常清晰 2.从函数返 ...

  2. ES6—— 变量的结构赋值

    变量的结构赋值.基本概念: 本质上就是一中匹配模式,只要等号两边的模式相同,那么左边的变量就可以被赋予对应的值: 1.数组的结构赋值. 2.对象的结构赋值. 3.基本类型的结构赋值. let [a,b ...

  3. ES6必知必会 (一)—— 变量声明和结构赋值

    本文章属于个人对es6一些比较常用的语法的总结归纳,其主要参考阮一峰大神的<a href="http://es6.ruanyifeng.com//">ECMAScrip ...

  4. ES6 变量的结构赋值

    1.数组的解构赋值 a.基本用法:(‘模糊匹配’) let [a, b, c] = [1, 2, 3]; a b c b.嵌套数组结构例子: let [x, , y] = [1, 2, 3]; x y ...

  5. ES6 变量的结构赋值用途(实用技巧)

    1.交换变量的值 let x=1; let y=2; [x,y]=[y,x];//x=2,y=1 2.从函数返回多个值 函数只能返回一个值,如果要返回多个值,只能将它们放在数组或者对象里返回,有了解构 ...

  6. 【ES6基础】let、const命令和变量的结构赋值

    ES5声明变量(2):var .function ES6声明变量(6):var.function.let.const.import和class 1.let命令和const命令 (1)let和const ...

  7. ES6必知必会 (四)—— Symbol、Set和Map

    Symbol 1.Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值.它是 JavaScript 语言的第七种数据类型,前六种分别是:undefined.null.布尔值(Bool ...

  8. ES6必知必会 (三)—— 数组和对象的拓展

    数组的扩展 1.拓展运算符('...'),它相当于rest参数的逆运算,用于将一个数组转换为用逗号分隔的参数序列: console.log(...[1, 2, 3]) // 1 2 3 console ...

  9. ES6必知必会 (九)—— Module

    Module 1.ES6在语言标准的层面上,实现了模块功能,成为浏览器和服务器通用的模块解决方案,完全可以取代 CommonJS 和 AMD 规范,基本特点如下: 每一个模块只加载一次, 每一个JS只 ...

随机推荐

  1. oracle 架构和一些工具了解

    oracle的架构大概分为3部分, 客户端:用户端 oracle instance:叫做实例,由内存结构(内存池或者叫SGA)和后台进程组成.Oracle Instance是Oracle RDBMS的 ...

  2. AndroidStudio中debug.keystore文件不存在解决办法

    Android项目丢失了debug.keystore,直接重新生存一个key. 在cmd下,进入C:\Users\Administrator\.android目录执行命令如下:  keytool -g ...

  3. iostat主要性能指标

    iostat参数很多,日常运维中主要关注一下字段(根据这些字段的输出内容一般就可以确定服务器是否存在IO性能瓶颈) 1.%iowait:CPU等待输入输出完成时间的百分比.该值较高,表示磁盘存在I/O ...

  4. Android现有工程使用Compose

    Android现有工程使用Compose 看了Compose的示例工程后,我们也想使用Compose.基于目前情况,在现有工程基础上添加Compose功能. 引入Compose 首先我们安装 Andr ...

  5. 【完虐算法】LeetCode 接雨水问题,全复盘

    大家好! 动态规划题目是总结的比较完整了.下面是自从和大家刷开题总结的动态规划解题方法. 今年全国夏天雨是真的多,突然想到今年北京的夏天也不像往年那么热.不知不觉就稳稳地度过了夏天来到秋天. 恰巧前几 ...

  6. LeetCode刷题 树专题

    树专题 关于树的几个基本概念 1 树的节点定义 2 关于二叉树的遍历方法 2.1 前序遍历 2.2 中序遍历 2.3 后序遍历 2.4 层序遍历 3 几种常见的树介绍 3.1 完全二叉树 3.2 二叉 ...

  7. 【JAVA】笔记(2)---面向过程与面向对象;类,对象;实例变量,引用;构造方法;

    面向过程与面向对象: 1.面向过程思想的典型栗子是C语言,C语言实现一个程序的流程是:在主函数中一步一步地罗列代码(定义子函数来罗列也是一样的道理),以此来实现我们想要的效果: 2.面向对象思想的典型 ...

  8. Python 操作 Redis 发布订阅

    Python 操作 Redis 发布订阅 介绍 Redis可以通过多个客户机订阅相同的频道,一个服务机在相应频道进行发布,从而实现在客户机收听服务机发布相应信息,可以利用这个机制实现多个客户机之间的信 ...

  9. HCNP Routing&Switching之BGP团体属性和团体属性过滤器

    前文我们了解了BGP的路由过滤已经as-path过滤器的使用相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15542559.html:今天我们来聊一聊 ...

  10. [cf1349E]Slime and Hats

    首先,当发现全场不存在黑色帽子时,显然所有人都知道其是白色帽子,即必然离开 当第一轮时,若第$n$个人发现前面$n-1$个人全是白色时,其自己必然是黑色,必然离开 而第二轮时,若第$n-1$个人发现$ ...