解构通俗点说,就是通过一种特定格式,快捷的读取对象/数组中的数据的方法,

es6之前,我们通过对象名称[键] 读取数据

         var User = {
'name' : 'ghostwu',
'age' : 22
};
console.log( User.name, User.age ); //ghostwu, 22
         var User = {
'name' : 'ghostwu',
'age' : 22
};
let { name, age } = User;
console.log( name, age ); //ghostwu 22

上面第5行就是一个简单的数据解构过程:

1,右边如果是对象,左边解构的语法也要用对象格式, 如果解构的数据是数组,左边就用数组格式
2,name, age是局部变量
3,解构出来的变量 一定要是 对象中能够查找到的属性名
4,如果解构出来的属性在对象中查找不到,值为undefined
         var User = {
'name' : 'ghostwu',
'age' : 22
};
let { name1, age1 } = User;
console.log( name1, age1 ); //undefined, undefined

解构出来的变量虽然是跟属性名称相同,但是他不再是属性,而是外部的变量,这个变量名也可以被修改, 不一定要跟属性同名

         var User = {
'name' : 'ghostwu',
'age' : 22
};
//解构出来的变量可以更改名称
let { name : name1, age : age1 } = User;
// console.log( name, age ); //报错, 因为name和age的名称已经被改了
console.log( name1, age1 ); //ghost, 22

更改解构出来的变量名称的语法:  旧的名称 : 新的名称

         var User = {
'name': 'ghostwu',
'age': 22
}; let { name, age, sex } = User;
// 解构出来的属性,如果不存在,默认值为undefined
console.log( name, age, sex ); //ghost 22 undefined
        var User = {
'name': 'ghostwu',
'age': 22
};
// 解构出来的值 可以赋值 一个默认的值
let { name, age, sex = 'man' } = User;
console.log( name, age, sex );

上述实例,为sex赋值了一个默认值 'man';

解构数组

         let arr = [ 10, 20, 30, 40 ];

         // 数组用[]解构
let [ one, two ] = arr;
console.log( one, two ); //10 20
 let arr = [ 10, 20, 30, 40 ];
// 对于不需要解构的值,可以用逗号占位
let [ , , , a ] = arr;
console.log( a ); //

解构嵌套数组

         let arr = [ 10, [ 20, 30 ], 40 ];
console.log( arr[1][1] ); //
let [ one, two, three, four ] = arr;
console.log( one, two, three, four ); //10 [20, 30] 40 undefined
[ one, [ two, three ], four ] = arr; //前面不要let,否则会报重定义错误
console.log( one, two, three, four ); //10 20 30 40

在以前,我们交换变量,一般的做法是借助第三个变量, 而现在有了解构之后,我们可以直接交换

         /*
交换两个变量的值
*/
let a = 10, b = 20;
[ a, b ] = [ b, a ]; //前面不要加let,否则会报 重定义错误
console.log( a, b ); //20, 10

利用解构出来的值,修改局部变量的值

         let User = {
name : 'ghostwu',
age : 22
},
name = 'zhangsan',
age = 30; //小括号: 把下面这个 转成解构表达式, 如果不用小括号会报错
({ name, age } = User);
console.log( name, age ); //ghostwu, 22
         let name = 'zhangsan', age = 40;
({ name, age } = {
name,
age
}); console.log( name, age ); //zhangsan 40

上述实例,是一个对象赋值的简写语法,你还记得吗?

         let User = {
name : 'ghostwu',
age : 22
}; //重命名局部变量,mySex:赋初始值
let { name : myName, age : myAge, sex : mySex = 'man' } = User;
console.log( myName, myAge, mySex ); //ghostwu 22 man

解构表达式传参

         let User = {
name : 'ghostwu',
age : 22
}; function show( obj ){
console.log( obj ); //obj其实就是User对象
console.log( obj === User ); //true
//函数中可以访问在参数中解构出来的变量
console.log( name, age ); //ghostwu, 22
}
show( { name, age } = User ); //表达式传值,整个表达式的值 取决于右边,所以把User传给了obj
console.log( name, age ); //ghostwu, 22

嵌套对象的解构

         let User = {
name : 'ghostwu',
age : 22,
class : {
group1 : {
one : '王超',
two : '马汉'
},
group2 : {
one : '张龙',
two : '赵虎'
}
}
};
//在User对象解构class, 在class中解构group1
let { class : { group1 } } = User;
console.log( group1.one ); //王超
console.log( group1.two ); //马汉 //在User对象解构class, 在class中解构group1, 在group1中解构one, two
({ class : { group1 : { one, two } } } = User);
console.log( one, two ); //王超, 马汉 //重命名group1 为 diyizu
({ class : { group1 : diyizu } } = User);
console.log( diyizu.one ); //王超
console.log( diyizu.two ); //马汉 //three 赋默认值
({ class : { group1 : { one, two, three = '展昭' } } } = User);
console.log( one, two, three );//王超,马汉,展昭

解构中的不定参数(...)

        let arr = [ 10, 20, 30 ];
let [ one, ...others ] = arr;
console.log( others.length ); //
console.log( one ); //
console.log( others[0] ); //
console.log( others[1] ); //
         //es6之前,用concat复制数组
let arr = [ 10, 20, 30 ];
let newArr = arr.concat();
console.log( newArr );
         //用解构与不定参数结合 复制 数组
let arr = [ 10, 20, 30 ];
let [ ...newArr ] = arr;
console.log( newArr );

最后一道综合练习题: 对象与数组的混合解构,能看懂,基本就算掌握了

         let User = {
name : 'ghostwu',
age : 22,
class : {
group1 : {
one : '王超',
two : '马汉'
},
group2 : {
one : '张龙',
two : '赵虎'
}
},
arr : [ 10, 20, 30 ]
}; // let { name, age, class : { group1 }, arr } = User;
let { name, age, class : { group1, group2 }, arr : [ one, two, three ] } = User;
// console.log( name, age, group1.one, group1.two, arr );
console.log( name, age, group1.one, group1.two, group2.one, group2.two, one, two, three );

[js高手之路]es6系列教程 - 解构详解的更多相关文章

  1. [js高手之路] es6系列教程 - 箭头函数详解

    箭头函数是es6新增的非常有意思的特性,初次写起来,可能会觉得别扭,习惯之后,会发现很精简. 什么是箭头函数? 箭头函数是一种使用箭头( => )定义函数的新语法, 主要有以下特性: 不能通过n ...

  2. [js高手之路] es6系列教程 - 对象功能扩展详解

    第一:字面量对象的方法,支持缩写形式 //es6之前,这么写 var User = { name : 'ghostwu', showName : function(){ return this.nam ...

  3. [js高手之路] es6系列教程 - 迭代器,生成器,for...of,entries,values,keys等详解

    接着上文[js高手之路] es6系列教程 - 迭代器与生成器详解继续. 在es6中引入了一个新的循环结构for ....of, 主要是用来循环可迭代的对象,那么什么是可迭代的对象呢? 可迭代的对象一般 ...

  4. [js高手之路] es6系列教程 - 迭代器与生成器详解

    什么是迭代器? 迭代器是一种特殊对象,这种对象具有以下特点: 1,所有对象都有一个next方法 2,每次调用next方法,都会返回一个对象,该对象包含两个属性,一个是value, 表示下一个将要返回的 ...

  5. [js高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)

    关于promise我在之前的文章已经应用过好几次,如[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist,本文就来讲解下pro ...

  6. [js高手之路] es6系列教程 - 函数的默认参数详解

    在ES6之前,我们一般用短路表达式处理默认参数 function show( a, b ){ var a = a || 10; var b = b || 20; console.log( a, b ) ...

  7. [js高手之路] es6系列教程 - var, let, const详解

    function show( flag ){ console.log( a ); if( flag ){ var a = 'ghostwu'; return a; } else { console.l ...

  8. [js高手之路] es6系列教程 - Set详解与抽奖程序应用实战

    我们还是从一些现有的需求和问题出发,为什么会有set,他的存在是为了解决什么问题? 我们看一个这样的例子,为一个对象添加键值对 var obj = Object.create( null ); obj ...

  9. [js高手之路] es6系列教程 - Map详解以及常用api

    ECMAScript 6中的Map类型是一种存储着许多键值对的有序列表.键值对支持所有的数据类型. 键 0 和 ‘0’会被当做两个不同的键,不会发生强制类型转换. 如何使用Map? let map = ...

随机推荐

  1. JAVA优雅停机的实现

    最近在项目中需要写一个数据转换引擎服务,每过5分钟同步一次数据.具体实现是启动engine server后会初始化一个ScheduledExecutorService和一个ThreadPoolExec ...

  2. loadrunner 手工参数拼接与l oadrunner的url编码

    Acction() { //演示需要的一些变量,提前声明 char *name = "yezi_zh"; "; char *work = "engin" ...

  3. grub2详解(翻译和整理官方手册)

    翻译了grub2官方手册的绝大部分内容,然后自己整理了一下.因为内容有点杂,所以章节安排上可能不是太合理,敬请谅解. 本文目录: 1.1 基础内容 1.2 安装grub2 1.3 grub2配置文件 ...

  4. [leetcode-357-Count Numbers with Unique Digits]

    Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Examp ...

  5. 2.如何实现使用VBS脚本程序对直播间自动评论

    前言:本文使用的是VBS脚本,实现了对繁星直播自动登录,自动进入房间并且自动评论. 前提准备:把需要刷的评论放到mysql中,再使用vbs读出评论 -------------------------- ...

  6. 使用 sitemesh/decorator装饰器装饰jsp页面(原理及详细配置)

    摘要:首先这个Decorator解释一下这个单词:“装饰器”,我觉得其实可以这样理解,他就像我们用到的Frame,他把每个页面共有的东西提炼了出来,也可能我们也会用各种各样的include标签,将我们 ...

  7. Grafana中整个Dashboard报错问题解决

    操作Grafana时,有时不小心按了"CTRL+Z",会导致整个Dashboard出错,如下所示: 目前找到一个解决方案,也许不是正路,但是能解决上述问题,如果有了更简单有效的解决 ...

  8. href 和 src 区别

    去网上百度了一下,感觉还是没有清楚的定义,所以自己稍稍的总结了一下: 1 html标签分为行类元素 和块元素 在加空元素(也可以叫做替换元素img input iframe):当元素为替换元素的时候, ...

  9. oracle linux 7.3 下用dtrace 跟踪 mysql-community-server-5.6.20

    第一部分:oracle linux 7.3 dtrace 安装: http://public-yum.oracle.com/   内核升极到 [root@server1 SPECS]# uname - ...

  10. JavaWeb 后端 <二> 之 Servlet 学习笔记

    一.Servlet概述 1.什么是Servlet Servlet是一个运行在服务器端的Java小程序,通过HTTP协议用于接收来自客户端请求,并发出响应. 2.Servlet中的方法 public v ...