2.解构赋值

2.1.什么是解构赋值?

什么是解构赋值?这里的关键字还是赋值,这是说如何去赋值的问题,这里说的解构可以理解为解散重新构造,所以解构赋值可以理解为解散重新构造后进行赋值,通常是左边一种结构,右边一种结构,左右的结构拆开来一一对应进行赋值,例如:

let a, b
[a, b] = [1, 2]
console.log(a, b)

这里就相当于把1赋值给a,把2赋值给b,这样的操作就叫做解构赋值,从本质上来说,结构解构赋值是一种匹配模式,只要等号两边的模式相同,那么左边的变量就可以被赋值给右边对应的值

为什么要使用解构赋值?在没有解构赋值的时候,多个赋值会比较麻烦,为了书写更加方便,加入解构赋值是非常有必要的,例如:没有解构赋值的时候,交互两个变量的值,我们是这样做的

let a = 10;
let b = 20;
let temp = a;
a = b;
b = temp; console.log(a, b);

有了解构赋值以后,我们的代码可以这样写:


let a = 10;
let b = 20;
[a, b] = [b, a];
console.log(a, b);

2.2.数组的解构赋值

左右两边是数组这种结构,我们称为数组的解构赋值,这样也是非常常用的一种形式

注意1: 解构不成功,值为undefined

let [a, b] = [10]
console.log(a, b) // 10, undefined

注意2: 解构的时候可以设置默认值

let [a, b=20] = [10]
console.log(a, b) // 10 20

注意3: 值比变量多的情况可以使用"..."符号

let [a, b, ...rest] = [1, 2, 3, 4, 5, 6]
console.log(a,b,rest) //rest元素必须放在最后,下面这种写法会报错
let [a, b, ...rest, c] = [1, 2, 3, 4, 5, 6]

2.3.对象的解构赋值

如果等号左右两边是对象的结构,我们称之为对象的解构赋值,也是非常常用的形式

let { a:a, b:b } = { a: 1, b: 2 }
console.log(a, b)

注意1: 对象的解构赋值和数组不同,数组的赋值是以位置为对应关系进行赋值的,必须按顺序来写,而对象的赋值是以属性名为对应关系的,因此,不用考虑顺序,其内部的机制就是,先找到同名的属性,再把右边的值赋值给左边的变量

注意2: 如果左边的({属性名:变量名})属性名和变量名一样,那么可以简写成下面的形式

// let { a:a, b:b } = { a: 1, b: 2 }
//上面这种写法和下面的写法是等价的
let {a, b} = {a:1,b:2}
console.log(a, b) //如果属性名和变量名是不同的,那必须写完整,例如下面这种写法 let {x:m,y:n} = {x: 1, y: 2}
// 这里的机制是 根据x的对应关系 把1赋值给m 根据y的对应关系,把2赋值给n

注意3: 对象的解构赋值也可以设置默认值


let {a, b=20} = {a: 1}
console.log(a, b) //1, 20

2.4.数组和对象解构赋值嵌套

// 数组的解构赋值嵌套
let [a, [b, c],d] = [1, [2, 3], 4]
console.log(a, b, c, d) // 对象的解构赋值嵌套 let obj = {
p: [
'Hello',
{ y: 'World' }
]
}; let { p, p: [x, { y }] } = obj;
//p=['hello', {y: 'world'}] x='Hello' y = 'World'

2.5.解构赋值应用

1.变量交换

let a = 10;
let b = 20;
[a, b] = [b, a];
console.log(a, b);

2.函数返回多个值

function fn() {
return [1, 2, 3];
}
let [a, b, c] = fn();

3.参数定义

// 参数是一组有次序的值
function f([x, y, z]) { ... }
f([1, 2, 3]); // 参数是一组无次序的值
function f({x, y, z}) { ... }
f({z: 3, y: 2, x: 1});

4.提取json数据

let jsonData = {
id: 42,
status: "OK",
data: [867, 5309]
}; let { id, status, data: number } = jsonData; console.log(id, status, number);
// 42, "OK", [867, 5309]

视频教程地址:http://edu.nodeing.com/course/50

es6+最佳入门实践(2)的更多相关文章

  1. es6+最佳入门实践(14)

    14.模版字符串 模版字符串(template string)是增强版的字符串,定义一个模版字符串需要用到反引号 let s = `这是一个模版字符串` console.log(s) 14.1.模版字 ...

  2. es6+最佳入门实践(12)

    12.class基础用法和继承 12.1.class基础语法 在es5中,面向对象我们通常写成这样 function Person(name,age) { this.name = name; this ...

  3. es6+最佳入门实践(10)

    10.Generator 10.1.Generator是什么? Generator函数是ES6提供的一种异步编程解决方案.在它的内部封装了多个状态,因此,又可以理解为一种状态机,执行Generator ...

  4. es6+最佳入门实践(9)

    9.Iterator和for...of 9.1.Iterator是什么? Iterator又叫做迭代器,它是一种接口,为各种不同的数据结构提供统一的访问机制.这里说的接口可以形象的理解为USB接口,有 ...

  5. es6+最佳入门实践(8)

    8.Promise 8.1.什么是异步? 要理解异步,首先,从同步代码开始说 alert(1) alert(2) 像上面的代码,执行顺序是从上到下,先后弹出1和2,这种代码叫做同步代码 alert(0 ...

  6. es6+最佳入门实践(7)

    7.set和map数据结构 7.1.什么是set? Set就是集合,集合是由一组无序且唯一的项组成,在es6中新增了set这种数据结构,有点类似于数组,但是它的元素是唯一的,没有重复 let st = ...

  7. es6+最佳入门实践(6)

    6.Symbol用法 6.1.什么是Symbol? Symbol是es6中一种新增加的数据类型,它表示独一无二的值.es5中我们把数据类型分为基本数据类型(字符串.数字.布尔.undefined.nu ...

  8. es6+最佳入门实践(5)

    5.对象扩展 5.1.对象简写 在es5中,有这样一种写法 var name = "xiaoqiang"; var age = 12; var obj = { name : nam ...

  9. es6+最佳入门实践(4)

    4.函数扩展 4.1.参数默认值 默认参数就是当用户没有传值的时候函数内部默认使用的值,在es5中我们通过逻辑运算符||来实现 function Fn(a, b) { b = b || "n ...

  10. es6+最佳入门实践(3)

    3.数组扩展 3.1.扩展运算符 扩展运算符用三个点(...)表示,从字面上理解,它的功能就是把数组扩展开来,具体形式如下: let arr = [1, 2, 3]; console.log(...a ...

随机推荐

  1. js中break跳出多层循环

    // 当执行多重循环的时候break的情况 outer: for(var i=0;i<10;i++){ inter: for(var j=0;j<10;j++){ if(i>5){ ...

  2. Yii2 设计模式

    一. 单例模式 顾名思义, 单例模式就是只实例一次,通过一个接口去实现多处需要的同一类对象的需求. 例子: public function __construct($config = []) { Yi ...

  3. 深度CNN

    [具体参考可以看这里(https://cloud.tencent.com/developer/article/1369425)

  4. 2019-04-11 python入门学习——配置机器及搭建开发环境

    # 在windows操作系统中搭建python 3.x版本的开发环境,开发工具为 Anaconda 3. # 1.1 下载及安装Anaconda 3 Anaconda的特点:集成性高,包含很多常用的开 ...

  5. 宁夏邀请赛F FLOYD

    Moving On Firdaws and Fatinah are living in a country with nn cities, numbered from 11 to nn.Each ci ...

  6. Educational Codeforces Round 37 E. Connected Components?(图论)

    E. Connected Components? time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  7. [Codeforces958A2]Death Stars (medium)(字符串+hash)

    Description 题目链接 Solution 这里用类似hash的方法将判断2个矩阵是否相同的时间降为O(m),总时间复杂度为O(m3) Code #include <cstdio> ...

  8. python基础之多态与多态性、绑定方法和非绑定方法

    多态与多态性 多态 多态并不是一个新的知识 多态是指一类事物有多种形态,在类里就是指一个抽象类有多个子类,因而多态的概念依赖于继承 举个栗子:动物有多种形态,人.狗.猫.猪等,python的序列数据类 ...

  9. 2,Python常用库之二:Pandas

    Pandas是用于数据操纵和分析,建立在Numpy之上的.Pandas为Python带来了两种新的数据结构:Pandas Series和Pandas DataFrame,借助这两种数据结构,我们能够轻 ...

  10. 1 Django初探

    1.理解MTV request 向服务器请求 response发送数据给用户 M:数据库取出数据 T: 模板渲染 V:渲染好的网页返回给用户 URL找到特定的views 2.创建django项目 (1 ...