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

1. 数组解构赋值

(1)按照变量位置对应赋值  ---- "匹配模式"

 let [a, b, c] = [1, 2, 3]
console.log(a, b, c) // 1 2 3
let [foo, [[bar], baz]] = [1, [[2], 3]]
console.log(foo, bar, baz) // 1 2 3
5 let [a, , c] = [1, 2, 3]
6 console.log(a, c) // 1 3
7 let [x, y, z] = [1, [2, 3], 4]
8 console.log(x, y, z) // 1 [2,3] 4
 

(2)  有时候如果遇到解构不成功时,就会返回undefined

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

(3)解构成功但不完全解构 :

  1,2分别赋值给了a,c 但是没有任何变量可以被3赋值

  同理:2赋给了y, 但是3没有赋给任何变量

let [a, c] = [1, 2, 3]
console.log(a, c) // 1 2
let [x, [y], z] = [1, [2, 3], 4]
console.log(x, y, z) // 1 2 4

(4)数据类型不一样时报错 : 因为左边定义了一个数组,数组内元素为a变量 , 但是右边没有相同的数据结构, 故报出"Uncaught TypeError: Invalid attempt to destructure non-iterable instance" 错误 ,这部分涉及到Interator接口的问题,后边章节会提到。

 let [a] = 1;
let [a] = false;
let [a] = NaN;
let [a] = undefined;
let [a] = null;
let [a] = {};
7 console.log(a) // 报错: Uncaught TypeError: Invalid attempt to destructure non-iterable instance

(5)结构Set数据结构, Set本身是ES6新增的一种类似数组的数据结构 , 但它内部元素没有重复值,也经常被用到数组去重的操作。

let [a, b, c] = new Set([1, 2, 3])
console.log(a, b, c) // 1 2 3
let a = new Set([1,2,3])
console.log(...a) // 1 2 3
console.log(a) // Set({})

(6)默认值: 有默认值的变量, 如没赋值则取默认值, 未赋值也无默认值则返回undefined

 let [a = 1] = []
console.log(a) //
let [b] = []
console.log(b) // undefined
let [c = 1] = [undefined]
console.log(c) // 1

2. 对象解构赋值

对象解构赋值和数组解构赋值类似, 只是将[]换成{}, 赋值由值换成键值对

(1)简单的对象解构赋值 : 注意 --- 返回的是值而非键值对

 let {a, b} = {a: 'AAA', b: 'BBB'}
console.log(a, b) // AAA BBB
 let {a, c} = {a: 'AAA', b: 'BBB'}
console.log(a, c) // AAA undefined
 let {a, b} = {a: 'AAA', b: 'BBB'}
console.log(a, d) // Error: d is not defined

以上三种情况对比可以看出 :

  a , b必须对应右边的键key,才有返回值value

  c 在右边没有被赋值, 所有返回了undefined

而 d 没有被声明, 自然会报错  Error: d is not defined

  其实对象的解构赋值完整格式如下 : 但是在ES6中推荐声明键和值一样时只需写键即可, 在Vue,React项目中已经大量使用简写方式,在eslint语法检测中, 如键值都写也会被报出警告。

 let {a: a, b: b} = {a: 'AAA', b: 'BBB'}
console.log(a, b) // AAA BBB

如键值不同,才必须使用完整格式

let {a: c, b: d} = {a: 'AAA', b: 'BBB'}
console.log(c, d) // AAA BBB

(2)默认值和解构不成功,以及不完全解构, 与数组的形式类同, 不再赘述。

3.字符串解构赋值

  字符串结构赋值其实是把字符串中每个字符赋值到给定的变量

 let [a, b, c, d, e, f] = 'hello'
console.log(a, b, c, d, e, f) // h e l l o undefined

其中f 声明了但未被赋值,所以返回 undefined

4. 数值和布尔值的解构赋值不常用,此处省略

5. 函数参数的解构赋值

 function sum1(a, b) {
return a + b
} console.log(sum1(3, 4)) function sum2([a, b]) {
return a + b
} console.log(sum2([3, 4]))

以上两个函数结果是一样的,第一种是常规的声明了形参a,b, 第二种是以数组解构赋值的方式把值传给了数组内的两个变量 a, b

(1)无默认值与有默认值 : 当声明未赋值时有默认值返回默认值, 无默认值返回undefined

 function foo({x, y} = {}) {
// console.log(x + y) // 3
return [x, y]
} console.log(foo({x: 1, y: 2})) // [1, 2]
console.log(foo({x: 3})) // [3, undefined]
console.log(foo({})) // [undefined, undefined]
console.log(foo()) // [undefined, undefined]
 function foo({x = 1, y = 1} = {}) {
// console.log(x + y) // 3
return [x, y]
} console.log(foo({x: 1, y: 2})) // [1, 2]
console.log(foo({x: 3})) // [3, 1]
console.log(foo({})) // [1, 1]
console.log(foo()) // [1, 1]

6. 解构赋值一般用在哪些场景?

(1)变量交互

 ## 传统的变量交换
var a = 1
var b = 2
console.log(a) //
console.log(b) //
var x = a
a = b
b = x
console.log(x) //
console.log(a) //
console.log(b) //

ES6学习之 解构赋值的更多相关文章

  1. es6学习笔记--解构赋值

    昨天学习了es6语法中解构赋值,解构赋值在声明中和函数传参提高了灵活性和便捷性,值得掌握该语法. 概念: ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构.   数组的解构 ...

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

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

  3. ES6学习-5 解构赋值(2)对象的解构赋值

    啥也不说,先举个栗子: 1 let { myname, myage } = { myage: 18, myname: "郭郭" }; 2 console.log(myname) / ...

  4. ES6 - 变量的解构赋值学习笔记

    变量的解析赋值 数组的解析赋值 es6允许按照一定的模式,从数组和对象中提取值,对变量进行赋值,这就称为解构. var a = 1; var b = 2; var c = 3; //在es6中允许写成 ...

  5. es6变量的解构赋值学习笔记

    1. 解构赋值的规则是,只要等号右边的值不是对象,就先将其转为对象.由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错. let { prop: x } = undefin ...

  6. 【JS】325- 深度理解ES6中的解构赋值

    点击上方"前端自习课"关注,学习起来~ 对象和数组时 Javascript 中最常用的两种数据结构,由于 JSON 数据格式的普及,二者已经成为 Javascript 语言中特别重 ...

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

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

  8. ES6 - Note2:解构赋值

    ES6的解构赋值就是利用模式匹配从按照一定模式的数组或者对象中提取值赋值给变量. 1.数组的解构赋值 在ES6以前,变量的赋值是直接指定的,以后可以这么来写,如下所示 let [a,b,c] = [1 ...

  9. ES6 变量的解构赋值

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

随机推荐

  1. Deck of Cards ZOJ - 2852 dp 多决策 三维 滚动更新

    题意:一个特殊21点游戏 具体http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2852 题解:建一个三维dp,表示三个卡槽分别 ...

  2. [hardware][intel] intel全系列网卡调研

    除了公司用,我自己还要买一块家用. 但是在这一切开始之前,还需要搞清楚PCIE到底咋回事. 一, 总线 https://zh.wikipedia.org/wiki/%E6%80%BB%E7%BA%BF ...

  3. EF-CodeFirst-数据迁移

    数据迁移 之前说到Code-First中有不同的数据库初始化策略,如CreateDatabaseIfNotExists,DropCreateDatabaseIfModelChanges和DropCre ...

  4. EF-CodeFirst-基础

    什么是Code-First Code-First主要用于领域驱动设计.在Code-First方法中,专注于应用程序的域,先开始为域实体创建类,而不是先设计数据库,然后创建与数据库设计相匹配的类.下图说 ...

  5. RMAN.DBMS_RCVCAT 版本错误处理

    登录新装的catalog库准备注册数据库时报版本问题 rman target / catalog rman11g/rman2010#@rman Recovery Manager:Release 11. ...

  6. 20165225 2017-2018-2《Java程序设计》课程总结

    20165225 2017-2018-2<Java程序设计>课程总结 - 每周作业链接汇总: 预备作业一:我期待的师生关系 预备作业二:学习基础和C语言基础调查 预备作业三:linux安装 ...

  7. SQL Server 2008 R2提示评估期已过

    解决SQL Server 2008 r2提示评估期已过 1.注册表把 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\Co ...

  8. Examples of GoF Design Patterns in Java's core libraries

    设计模式分类 stackOverflow Structural(结构模式) Adapter:把一个接口或是类变成另外一种. java.util.Arrays#asList() javax.swing. ...

  9. SSM(Spring+SpringMVC+Mybatis)框架环境搭建(整合步骤)(一)

    1. 前言 最近在写毕设过程中,重新梳理了一遍SSM框架,特此记录一下. 附上源码:https://gitee.com/niceyoo/jeenotes-ssm 2. 概述 在写代码之前我们先了解一下 ...

  10. 让网站不去请求favicon.ico图标

    让网站不去请求favicon.ico图标 favicon.ico 图标用于收藏夹图标和浏览器标签上的显示,如果不设置,浏览器会请求网站根目录的这个图标,如果网站根目录也没有这图标会产生 404.出于优 ...