ES6的解构赋值就是利用模式匹配从按照一定模式的数组或者对象中提取值赋值给变量。

1.数组的解构赋值

在ES6以前,变量的赋值是直接指定的,以后可以这么来写,如下所示

  1. let [a,b,c] = [1,2,3];
  2. console.log(a,b,c)
  3. 1 2 3

解构赋值只要等号两边的模式一致,便可解析成功,如下所示

  1. var [d,[f,g]] = [3,[4,5]];
  2. console.log(d,f,g);
  3. 3 4 5
  4. -----------------------------
  5. var [,,e] = [0,0,1];
  6. console.log(e);
  7. 1
  8. -----------------------------
  9. var [f,...g] = [2,4,5,6,7];
  10. console.log(g);
  11. Array [ 4, 5, 6, 7 ]

如果解构不成功,则变量的值等于undefined,如下所示

  1. var [x,y] = [1];
  2. console.log(x,y);
  3. 1 undefined

不完全解构,即是等号左边部分匹配等号右边,如下所示

  1. var [x,y] = [1,2,4];
  2. console.log(x,y);
  3. 1 2
  4. ------------------------
  5. var [[m],n] = [[1,2],3];
  6. console.log(m,n);
  7. 1 3

如果右边是不可遍历的数据解构,解构将会报错,如下所示

  1. var [x,y] = 1;
  2. TypeError: 1 is not iterable

带默认值的解构赋值,如下所示

  1. var [x='hello',y="world"] = [];
  2. console.log(x+' '+y);
  3. hello world
  4. //在ES6内部实现中,使用的是全等===来判断变量是否有值,因此变量的值不是严格的undefined,将不会采用默认值
  5. var [w="hello",y="world"] = [,null];
  6. console.log(w+' '+y);
  7. hello null

2.对象的解构赋值

对象的解构是按照属性名来的,不分先后顺序,如下所示

  1. var {y:j,x:i} = {x:1,y:2}
  2. console.log(i,j);
  3. 1 2

如果解构的时候等号左边出现等号右边没有的属性,则变量的值为undefined。如下所示

  1. var {y} = {z:'hello'};
  2. console.log(y);
  3. undefined

对象的解构也可以使用默认值,规则和数组解构一致

在使用已声明的变量进行对象解构赋值时,需要小心,因为大括号很有可能被解析器解析为代码块,如下所示

  1. var x;
  2. {x} = {x:1};
  3. SyntaxError: expected expression, got '='
  4. //这里需要用小括号括起来
  5. ({x} = {x:1});

3.字符串的解构赋值

字符串在进行解构赋值时会被转换层类数组,然后进行解析,如下所示

  1. const [a,b,c] = "hello";
  2. console.log(a,b,c);
  3. h e l
  1. var {length:len} = "test";
  2. console.log(len);
  3. 4

4.函数参数的解构赋值

函数参数也可以使用解构赋值,如下所示

  1. function test([x,y]){ return x+y; }
  2. test([1,3]);
  3. 4
  1. function test1({x=0,y=0}){ return x*y; }
  2. test1({});
  3. 0
  4. test1({x:4,y:5});
  5. 20

在解构赋值中,最好不要使用小括号。

解构赋值的用处也挺多的,比如在提取json数据,交换数据等地方

 

 

ES6 - Note2:解构赋值的更多相关文章

  1. ES6 的解构赋值前每次都创建一个对象吗?会加重 GC 的负担吗?

    本文来源于知乎上的一个提问. 为了程序的易读性,我们会使用 ES6 的解构赋值: function f({a,b}){} f({a:1,b:2}); 这个例子的函数调用中,会真的产生一个对象吗?如果会 ...

  2. ES6之解构赋值

    截止到ES6,共有6种声明变量的方法,分别是var .function以及新增的let.const.import和class: 我们通常的赋值方法是: var foo='foo'; function ...

  3. 进军es6(2)---解构赋值

    本该两周之前就该总结的,但最近一直在忙校招实习的事,耽误了很久.目前依然在等待阿里HR面后的结果中...但愿好事多磨!在阿里的某轮面试中面试官问到了es6的掌握情况,说明es6真的是大势所趋,我们更需 ...

  4. es6的解构赋值学习(1)

    相对es5的简单的"="赋值来说,es6增加了一种新的赋值模式--解构赋值,按照它的规则,可以从数组和对象中提取值来对变量进行赋值,个人觉得方便了很多,但是这个模式有点恶心人,相比 ...

  5. Es6 新增解构赋值

    1.数组的解构赋值 基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 要想实现解构,就必须是容器,或者具有可遍历的接口. 以前,为 ...

  6. ES6 之 解构赋值

    本博文配合 阮一峰 <ES6 标准入门(第3版)>一书进行简要概述 ES6 中变量的解构赋值. 数组的解构赋值 基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这 ...

  7. ES6变量解构赋值

    ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构ES6之前我们申明多个变量需要按照下面的方法: let l a=1; let b=2; let c=3; let d=4; ...

  8. es6变量解构赋值的用途

    这里是我觉得es6解构赋值,在平时我们写js的时候非常有用,而且经常用到的地方,能简化我们的代码,让写代码简介优雅易读; 用途 1.交换变量的值,太方便了这逼,写法不仅简介而且一看就明白 let [x ...

  9. 粗看ES6之解构赋值

    标签: javascript es6 什么是解构赋值? 示例如下: <!DOCTYPE html> <html> <head> <meta charset=& ...

  10. ES6变量解构赋值的用法

    一.数组赋值(从数组中提取值,按照对应位置,对变量赋值) 1. 完全解构(变量与值数目相等) let arr = [1, 2, 3]; let [a,b,c] = arr; console.log(a ...

随机推荐

  1. LINUX 编译安装 PHP 环境

    今天终于有时间 总结一下 linux 的编译安装 php 环境同学给我发了他写的文档 ,基本就可以实现编译安装了我同学文章地址: http://penghui.link/articles/2016/0 ...

  2. Java序列化、反序列化和单例模式

    学习JAVA的时候,特别是涉及到网络编程时,我们时常让我们的实体类实现一个接口 public class Entity implements Serializable{ } 这样子我们可以通过输入输出 ...

  3. can't connect to mysql server on 'localhost'(10061)

    在linux下安装Navicat,想说在windows下试一试phpmyadmin之外的mysql图形工具. 显示下载安装了mysql workbench,链接成功.然后又弄了一下输入法重启,想说试一 ...

  4. ant的安装及项目的发布

    1.安装ant1) 直接解压apache-ant-1.9.7-bin 2) 在环境变量中配置,ant_home的环境变量在 3) 在命令提示符中测试是否安装成功. 2 项目首次打包1) 写好打包的配置 ...

  5. IOS网络第七天WebView-01WebView和网页的交互1

    ******** #import "HMViewController.h" @interface HMViewController () <UIWebViewDelegate ...

  6. Microsoft Avro介绍

    Microsoft发布了他们自己对Apache Avro通信协议的实现.Avro被描述为"紧凑的二进制数据序列化格式,类似于Thrift或者Protocol Buffers",同时 ...

  7. ABP理论学习之依赖注入

    返回总目录 本篇目录 什么是依赖注入 传统方式产生的问题 解决办法 依赖注入框架 ABP中的依赖注入基础设施 注册 解析 其他 ASP.NET MVC和ASP.NET Web API集成 最后提示 什 ...

  8. [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦

    [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...

  9. Entity Framework与ADO.NET批量插入数据性能测试

    Entity Framework是.NET平台下的一种简单易用的ORM框架,它既便于Domain Model和持久层的OO设计,也提高了代码的可维护性.但在使用中发现,有几类业务场景是EF不太擅长的, ...

  10. Improve Your Study Habits

    1.Plan your time carefully. Make a list of your weekly tasks.Then make a schedule or chart of your t ...