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. 笔记-scrapy-去重

    笔记-scrapy-去重 1.      scrapy 去重 scrapy 版本:1.5.0 第一步是要找到去重的代码,scrapy在请求入列前去重,具体源码在scheduler.py: def en ...

  2. mysql学习第三天练习(日期和时间函数)

    -- 日期和时间函数 -- 获取当前日期 select curdate(),current_date() from dual -- 返回服务器当前的日期和时间 select NOW(),SYSDATE ...

  3. 大话CNN经典模型:LeNet

        近几年来,卷积神经网络(Convolutional Neural Networks,简称CNN)在图像识别中取得了非常成功的应用,成为深度学习的一大亮点.CNN发展至今,已经有很多变种,其中有 ...

  4. 分布式爬虫:使用Scrapy抓取数据

    分布式爬虫:使用Scrapy抓取数据 Scrapy是Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘. ...

  5. Spring---bean的命名

    每个Bean可以有一个或多个 id,我们把第一个 id 称为“标识符”,其余id叫做“别名”,这些id在 IoC 容器中必须唯一. Bean  id 的命名约定: 遵循XML命名规范 由字母,数字,下 ...

  6. Eclipse 窗口说明---Eclipse教程第03课

    Eclipse 工作台(Workbench) 首先,让我们来看一下Eclipse 作台用户界面,和它里面的各种组件. 工作台是多个窗口的集合.每个窗口包含菜单栏,工具栏,快捷方式栏,以及一个或者多个透 ...

  7. myeclipse用maven搭建web项目后tomcat启动报找不到jar包解决办法

    因为maven项目jar包放在Maven Dependencies内,用tomcat启动web项目,会找WEB-INF下的lib目录,需要部署Maven Dependencies 选中项目-prope ...

  8. laravel5.5artisan命令

    目录 1. 简介 2. 编写命令 2.1 构建自己的命令 2.2 闭包命令 3. 定义输入期望 4.I/O 命令 5. 注册命令 6. 调用命令 1. 简介 Artisan 是 Laravel 自带的 ...

  9. MyEclipse - 问题集 - maven update project 后,项目jdk的版本变化

    解决方法: 进入maven安装根目录,conf/settings.xml <profiles> <profile> <id>jdk-1.7</id> & ...

  10. CentOS6/7-防火墙管理

    #CentOS6 #开放端口运行外部访问(不指定源IP) iptables -I INPUT -p tcp --dport -j ACCEPT iptables -I INPUT -p tcp --d ...