昨天学习了es6语法中解构赋值,解构赋值在声明中和函数传参提高了灵活性和便捷性,值得掌握该语法。

概念:

ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。
 
数组的解构
 
let [a,b,c] = [1,2,3];
console.log(a); //
console.log(b); //
console.log(typeof c); // number
console.log(a === 1); // true
ps:解构不成功,变量的值就等于undefined

 let [arr,foo] = [1];
console.log(foo); // undefined
有两种解构:
 1 完全解构,等号左边的变量和等号右边的值一一对应
 2 不完全解构,等号左边的模式,只匹配一部分的等号右边的数组

let [x, y] = [1, 2, 3];
console.log(x); //
console.log(y); //
let [x,[a],y] = [1,[2,3],4];
console.log(a) //
数组解构赋值可以带有默认值

let [a,b=2] = [1];
console.log(a) //
console.log(b) //
解构赋值如果有默认值,与之对应的也有值,则覆盖默认值
let [a,b=2] = [1,3];
console.log(`a的值是${a} b的值是${b}` ) // 1 3
解构赋值中右边有undefined时,与之对应的左边会采用其默认值。若两者都是undefined,则为undefined

let [a,b=2] = [1,undefined];
console.log(`a的值是${a} b的值是${b}` ) // 1 2
ps:在es6的规定下,要判断两者是否相等,必须用三等===来判断。

let [a,b=2] = [1,null];
console.log(a) //
console.log(null === undefined) // false 严格模式下,null和undefined不等
console.log(b) // null
最常见的例子就是如何将两个数值互换,一般我们常用借用第三个变量或者用加减法来进行互换,因此数组的解构赋值也可以将两个数值互换。

let x = 1;
let y = 2;
[x, y] = [y, x];
console.log(`x:${x} y:${y}`) // x:2 y:1
 
对象的解构
 
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。如果对象解构赋值中没有找到对应的属性名,则返回undefined
let {b, a, c} = {a: 'peter', b: 'Bob'};
console.log(`a:${a} b:${b} c:${c}`) // peter Bob undefined
如果变量名和属性名不一致,根据对象解构的内部机制:先找到同名属性,然后再赋给对应的变量(我感觉既然是自己声明变量,倒不如向上面的一样就好)。

const obj = {
foo: 'peter',
bar: 25
};
let {foo: name, bar: age} = obj;
console.log(`name:${name} age:${age}`) // name:peter age:25
对象解构赋值的默认值情况跟数组一样。
 1 有默认值,与之对应的也有值,则覆盖默认值
 2 右边有undefined时,与之对应的左边会采用其默认值。若两者都是undefined,则为undefined
 3 右边的值是null,左边有默认值,也要返回null
ps: 当你解构对象并赋值给变量时,如果你已经声明或不打算声明这些变量(亦即赋值语句前没有let、const或var关键字),会报语法错误。
{obj} = {obj: 10}    //  Uncaught SyntaxError: Unexpected token =
这是因为JavaScript语法通知解析引擎将任何以{开始的语句解析为一个块语句(例如,{console}是一个合法块语句)。解决方案是将整个表达式用一对小括号包裹:

({obj} = {obj: 10})

在对象解构赋值中,最常用的就是,函数返回值,有多个时,可以按照返回对象的形式返回。

function foo() {
return {
foo: 1,
bar: 2
};
}
let { foo, bar } = foo();
可以提取 JSON 对象中的数据

let json = {
id: 1,
status: 200,
data: [123, 456]
};
let { id, status, data: number } = json;
console.log(id, status, number); // 1, 200, [123, 456]
 
字符串解构
 
字符串解构赋值,是字符串被转换成了一个类似数组的对象

let [a,b,c,d,e,f] = 'hello';
console.log(`a:${a} b:${b} c:${c} d:${d} e:${e} f:${f}`) // a:h b:e c:l d:l e:o f:undefined
console.log(typeof a) // string let [m,n,q,p] = 'w ord';
console.log(`m:${m} n:${n} q:${q} p:${p}`) // m:w n: q:o p:r let {length:len} = 'hello world';
console.log(len) // let [a='H',b,c,d,e,f='W'] = 'hello';
console.log(`a:${a} b:${b} c:${c} d:${d} e:${e} f:${f}`) // a:h b:e c:l d:l e:o f:W
从上面的例子可知:
 字符串是按着顺序依次赋值的,有空格也要赋值为空格。
 左边的变量声明的个数>右边赋值的个数,那么从左往右的后面的元素赋值为undefined
 左边的变量声明的个数<右边赋值的个数,那么右边多余的则不展示。
 如果有类似数组的对象有length,可以对这个进行赋值。
 有默认值的情况下,则会覆盖默认值,如果最后一个元素在赋值中为undefined则会使用默认值
 
函数参数的解构赋值
 
函数参数传参可以是数组,对象,以及字符串等等,按照以前的规定写,会出现冗杂,乱,通过解构赋值,可以解放了函数的传参。
 function add([x, y]){
return x + y;
}
console.log(add([1,2])); // 3
函数参数的解构赋值可以带有默认值

function move({x = 0, y = 0} = {}) {
return [x, y];
}
console.log(move({x: 1, y: 2})); // [1, 2]
console.log(move({x: 1})); // [1, 0]
console.log(move({})); // [0, 0]
console.log(move()); // [0, 0]

对应的笔记和实例,我放到了GitHub,https://github.com/sqh17/notes

有什么问题请私信或留下评论,一起加油。

参考资料:

阮一峰大大的es6标准入门:http://es6.ruanyifeng.com/

 

es6学习笔记--解构赋值的更多相关文章

  1. ES6学习之 解构赋值

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

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

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

  3. es6学习笔记2-解构赋值

    解构赋值基本概论就按照一定的模式通过数组或者对象对一组变量进行赋值的过程. 1.通过数组对变量进行赋值: /*通过这种方式赋值要注意左右两边的结构模式要一样,在赋值的时候,根据位置进行赋值对应模式.* ...

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

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

  5. ES6-11学习笔记--解构赋值

    解构赋值:按照一定模式,从数组和对象中提取值,对变量进行赋值.   数组解构 对象解构 字符串解构 应用场景     曾经的赋值噩梦,非解构赋值数组: let arr = [1, 2, 3]; let ...

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

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

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

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

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

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

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

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

随机推荐

  1. 【Oracle】-初识PL/SQL

    在最近的工作中要用到存储过程和函数,索性把PL/SQL整体的看一下.之前看过基本书和园子里的博文,在这里将所学简单总结. 一.基本语句 1.大小写 2.分隔符  --  : 3.引用字符串  --   ...

  2. Linux下绝对经典的命令

    1.使用远程终端时,可以使用如下命令: screen tmux 2.下载文件可以使用如下命令: curl wget 3.压缩解压缩可以使用: tar .zip.rar 4.使用抓包工具 tcpdump ...

  3. Scoping the Project for iOS 7

    Scoping the Project On This Page Things Every App Must Do Things Every App Should Do If You Must Con ...

  4. [记录]一则清理MySQL大表以释放磁盘空间的案例

    一则清理MySQL大表以释放磁盘空间的案例 一.基本情况: 1.dbtest库554G,先清理st_online_time_away_ds(37G)表的数据,保留半年的数据: 1)删除的数据:sele ...

  5. 批量修改git仓库地址脚本

    前言   公司的代码都存放在自己搭建的gitlab上面.之前由于老板升级gitlab.导致下面有个叫做"api"的groups无法访问.通过无所不能的谷歌才知道.在gitlab在某 ...

  6. 使用Ajax发送http请求(get&post请求)

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 同步和异步 同步和异步的概念 同步:必须等待前面的任务完成,才能继续后面 ...

  7. java 中对对象的调用

    java程序设计语言对对象采用的不是引用的调用,实际上对象引用进行的是值得传递.(from:核心卷1  page:123)

  8. mybatis3:Invalid bound statement (not found)

    最近在玩ssm框架搭建,突然发现最后的时候mybaits和SpringMvc进行整合的时候出现错误 Invalid bound statement (not found) 这个错误有可能出现在以下几个 ...

  9. 浏览器的 bfcache 特性

    一.bfcache 基本概念 现代浏览器在根据历史记录进行前进/后退操作时,会启用缓存机制,名为"bfcache"(back-forward cache,往返缓存),它使页面导航非 ...

  10. uva 1151最小生成树

    先求一次最小生成树,可以排除n*(n*1)/2-(n-1)条边,每次利用二进制法枚举套餐的选择,套餐中的点直接处理,如果两个套餐有公共点直接合并,他们一定连通,然后枚举第一步最小生成树得到的n-1条边 ...