最近看了一个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. 第一次java程序测试感受

    第一次JAVA程序设计测试,检验了一个暑假的成果.显而易见,我做的并不是很好,程序最起码的输入输出以及方法的定义还是没有问题的,但是考到了文件输入输出便看出来了.对于文件的输入输出,虽然我预习到那里, ...

  2. 2016年蓝桥杯省赛A组c++第5题(计算机组成原理)

    /* 下面的代码把一个整数的二进制表示的最右边的连续的1全部变成0 如果最后一位是0,则原数字保持不变. 如果采用代码中的测试数据,应该输出: 0000000000000000000000000110 ...

  3. [development][PCRE] old PCRE

    介绍, man手册 txt版 http://www.pcre.org/original/pcre.txt html版 http://www.pcre.org/original/doc/html/pcr ...

  4. scrollView截取指定区域的图片

    把scrollView放到一个容器里面,再截图就可以了 scrollview放到容器: UIView *lunboCarrier = [[UIView alloc] initWithFrame:CGR ...

  5. CABasicAnimation 划线动画

    CGFloat animateDuration = ; UIBezierPath *bezierPath = [[UIBezierPath alloc] init]; CGPoint centerFr ...

  6. da5_模块

    一.模块.包 什么是模块? 模块实质上就是一个python文件,它是用来组织代码的,意思就是说把python代码写到里面,文件名就是模块的名称,test.py test就是模块名称. 什么是包? 包, ...

  7. Win10系统桌面右键新建没有内容怎么恢复

    Win10系统桌面右键新建没有内容怎么恢复 添加txt文本文档 运行->regedit,打开注册表编辑器 展开HKEY_CLASSES_ROOT 找到.txt 选中.txt,修改右侧窗格的“默认 ...

  8. C#-1-2-C#基础

    1-注释符 1).单行注释符:// 2).多行注释符:/**/ 3).文档注释符:// 2-常用快捷键 3-变量类型 4-转义字符 5-语句 1.将相应内容打印到控制台:Console.WriteLi ...

  9. MySQL crash-safe replication【转载】

    本文来自david大神的博客,innodb技术内幕的作者. http://insidemysql.blog.163.com/blog/static/202834042201385190333/ MyS ...

  10. linux dmesg 查看系统故障信息

    dmesg 可以查看linux 内核信息 dmesg’命令设备故障的诊断是非常重要的.在‘dmesg’命令的帮助下进行硬件的连接或断开连接操作时,我们可以看到硬件的检测或者断开连接的信息.‘dmesg ...