最近看了一个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. springboot程序无法访问静态资源

    今天开发遇到了一个很奇葩的错误,再spngboot程序成功运行后发现无法访问再resouces/static下的静态资源,通过rul访问总是404,原因最终锁定在某配置类的一个标签上: @Enable ...

  2. deepin中idea中文乱码解决

    打开终端 命令: sudo su 输入密码: aptitude search uming 显示: root@terwer-PC:/home/terwer# aptitude search uming ...

  3. typedef define typedef可以使程序参数化,提高程序的可移植性。

    小结: 1. typedef并没有创建一个新类型,它只是为某个已存在的类型增加了一个新的名称而已: 2. typedef声明也没有证据新的语义:通过这种方式声明的变量与通过普通方式声明的变量具有完全相 ...

  4. PHP之流程控制

    nest 嵌套 the curly braces 花括号 colon syntax 冒号语法 PHP三种if判断的写法 写法一: if(true){ }else if(){ }else if(){ } ...

  5. 如何在win+r 或者是win10的应用搜索输入subl就能打开sublime

    这虽然不是什么技术贴,我实在不想开启sublime还要动鼠标,或者输入subl长长的全称,这里有两种做法: 第一种 在环境变量添加sublime安装目录的变量,一般sublime的安装目录会有subl ...

  6. python练习题-day1

    1.使用while循环输入 1 2 3 4 5 6     8 9 10 count=0 while count<10: count+=1 if count==7: continue print ...

  7. 如何让帝国CMS7.2搜索模板支持动态标签调用

    帝国cms站内搜索一般不支持动态标签调用,如果要调用如何实现呢?修改两个地方就可以实现了.打开 /e/search/result/index.php 文件,找到(文件改了,不会调用也是徒劳!看看这个帝 ...

  8. coocs2d-html5在使用cocoseditor时调用设备的accelerometer来使用重力感应

    在使用大牛touchsnow开发的插件cocoseditor开发游戏时遇到了一些问题,然后就试着解决.近期想试下coocs2d-html5是否能使用重力感应,发现是能够的.只是这个仅仅能在移动真机上測 ...

  9. if __name__==__main__:的应用

    1. if __name__==__main__:代码的作用 python的文件有两种使用的方法:(1)直接作为脚本执行:(2)import到其他的python脚本中被调用(模块重用)执行: 因此if ...

  10. NancyFx-打造小型 WebAPI 與 Microservice 的輕巧利器

    https://github.com/NancyFx/Nancy 在做非網站系統整合時,我很愛用一招:寫個 Process 提供 WebAPI 介面給其他系統呼叫,不管你用什麼烏語言鬼平台,怎麼可能找 ...