• 数组的解构赋值     var [a,b,c] = [1,2,3];    左边是变量,右边是值,根据数据结构一一对应
  1. 只要等号两边的模式相同,左边的变量就会被赋予右边对应的值,必须模式相同
  2. 如果等号右边的不是数组,确切的说不是可遍历的数组,那么将会报错
  3. 解构赋值不仅适用于var 命令,也适用于 let / const 命令   
    1. var [a,b,c,...d] = [];
      let [a,b,c,...d] = [];
      const [a,b,c,...d] = [];
  4. 只要是可遍历的数据,都可以使用数组的解构赋值:
    1. let [a,b,c] = new set(["1","2","3"]);
  5. 解构赋值同样允许指定默认值    let [a = "1",b] = [2];    //a=1  b=2
  6. 默认值可以引用其它变量,但是该变量必须已经声明
  • 对象的解构赋值       var {a,b} = {a: "1", b:"2"}     左边是变量名,右边是给属性赋值的对象列表,变量名必须与属性性名一致,才能取到正确的值,与次序完全没关系。
  1. 对象的解构赋值与数组有一个重要的不同,数组元素在解构赋值时,是按照次序排列赋值的,变量的值由位置决定;而对象没有次序,变量必须与属性性同名,才能取到正确的值
  2. 如果变量名与属性名不一致,必须把不一致的属性作为属性值赋值给有值的属性:
    1. let {a: d} = {a:"1",b:"2"};
      d //
  3. 对象的解构赋值的机制是:先找到同名属性,然后再赋值对应的变量。真正被赋值的是后者,而不是前者。上面的代码中,真正被赋值的是 d,而不是 a
  4. let 在声明变量之后,不可以再重复声明,如果想要重复声明,必须将再次声明的变量与赋值语句用圆括号括起来,否则会报错。使用圆括号的原因是,解析器会将起首的大括号,理解成一个代码块,而不是赋值语句
    1. let a;
      ({a} = {a:"1"}); //OK let b:
      ({c:b} = {c:"2"}); //OK let c:
      {c} = {c: 1} //error
      ({c} = {c:1}); //OK
  5. 对象的赋值表达式,也主是赋值语句,如果放在圆括号里,在大部分场景下都可以执行,如果不放在圆括号里,严格模式下是会报错的。
  6. 对象的解构赋值同样也可以指定默认值:  let {a=""3} = {}
  7. 对象的解构赋值,可以很方便的将现有对象的方法,赋值到某个变量
    1. function logo(){...}
      function setData(){...}
      function list(){...} 可以很方便的将上面的三个方法,赋值给一个变量: let {logo,setData,list} = Match;
  • 字符串的解构赋值  const [h,e,l,l,o] = 'hello'  字符的解构赋值是把字符串转换成了类似数组的对象,它有length属性值,只是类数组,数组的方法不可以用在类数组上
  • 数值和布尔值的解构赋值:如果等号右边的是数值或布尔值,要先转换为对象再赋值。解构赋值的规则是,只要等号右边的不是对象,就先将其转换为对象(undefined与null无法转为对象,所以无法对它们进行解构赋值)
  • 函数的参数也可以进行解构赋值,函数的参数也可以使用默认值

怎么让解析器判断,一个语句,到底是模式还是表达式,没有办法从一开始就知道,必须解析到等号才能知道。ES6的规则是:只要有可能导致解构歧义,就不要在模式中放置圆括号。建议,只要有可能,就不要在模式中使用圆括号。不能使用圆括号的三种情况:

  1. 变量声明语句中,不能带有圆括号,不能给变量添加圆括号
    1. var [(a)] = [1]                //错
  2. 函数参数中使用解构赋值时,不能给函数参数使用圆括号
    1. function([(a)]){return a}      //错
  3. 赋值语句中,不能将模式中的一部分或一层,放入圆括号
    1. ({a:"1"}) = {a:"100"}         //错
      ({a: "1"} = {a:"100"}) //正确
  • 可以使用圆括号的情况:首先是赋值语句
  1. 可以使用赋值语句的情况只有一种:赋值语的非模式部分,可以使用圆括号
    1. [(a)] = [3]; // 正确
      ({ a: (b) } = {}); // 正确
      [(parseInt.prop)] = [3]; // 正确
  2. 之所以能使用,是因为它们首先是赋值语句,而不是声明语句;
  3. 其次,它们的圆括号都不属于模式的一部分
  • 变量的解构赋值的用途
  1. 交换变量的值
  2. 从函数返回多个值    返回多个数组方法: let [a,b,c] = example();     返回多个对象方法: let {a,b} = example();
  3. 函数参数,可以很方便的将参数与变量名对应起来
  4. 提取JSON数据:   let {id,status,data:number} = jsonData;
  5. 遍历数组结构,很方便的获取键名或键值   for(let [key, value] of map){...}   获取键名: for(let [key] of map){...}     获取键值: for(let [value] of map){...}
  6. 加载模块指定, import {render} from 'react-dom';

ES6 变量的解构赋值的更多相关文章

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

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

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

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

  3. ES6变量的解构赋值

    变量的解构赋值 1.数组的解构赋值 2.对象的解构赋值 3.字符串的解构赋值 4.数值和布尔值的解构赋值 5.函数参数的解构赋值 6.圆括号问题 7.用途 1.数组的解构赋值 ES6 允许写成下面这样 ...

  4. es6—变量的解构赋值

    数组的解构赋值 ]]]]]]] = []}} = {}} = {}})]: first]: last} = arr} = {}) {}))}))}) {}))}))].]]]])})] }}} = { ...

  5. ES6变量的解构赋值(一)数组的解构赋值

    let[a,...arr]=[1,2,3,4];//a==>1 arr==>[2,3,4] let [x, y, ...z] = ['a'];//a==>'a' y==>und ...

  6. ES6变量的解构赋值(二)对象的解构赋值

    前面我们知道,数组的结构赋值需要按顺序进行赋值, let [a,,c] = [,,] console.log(a); console.log(c);//3 let [a,b] = [1];consol ...

  7. ES6中的变量的解构赋值, 解放我们的双手,实现变量的批量赋值

    ES6--变量的解构赋值 引言 正文 一.数组的解构赋值 解构失败 不完全解构 默认值 二.对象的解构赋值 三.字符串的解构赋值 结束语 引言 变量的解构赋值, 听起来很复杂, 简单点说可以理解成批量 ...

  8. es6之变量的解构赋值

    es5中通常我们声明变量都是以下的方式: var a = 10; var b = 20; var c = 30; //或者 var a = 10,b = 20,c = 30; //或者 var arr ...

  9. es6分享——变量的解构赋值

    变量的解构赋值:ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前的写法: var a = 1; var b = 2; es6允许的写法 ...

随机推荐

  1. CF722D. Generating Sets[贪心 STL]

    D. Generating Sets time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  2. AC日记——数字统计 openjudge 1.5 41

    41:数字统计 总时间限制:  1000ms 内存限制:  65536kB 描述 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数. 比如给定范围[2, 22],数字2在数2中出现了1次, ...

  3. 虚拟机VMware怎么完全卸载干净

    虚拟机VMware怎么完全卸载干净 听语音 | 浏览:19929 | 更新:2014-12-21 10:28 | 标签:虚拟机 1 2 3 4 5 6 7 分步阅读 一键约师傅 百度师傅高质屏和好师傅 ...

  4. 使用SQL如何把用逗号等字符隔开的字符串转换成列表(转)

    如何把用逗号等字符隔开的字符串转换成列表,下面依逗号分隔符为例: 比如有一个字符串,其值为:香港,张家港,北京,上海用SQL把这个字符串转换成列表的方法是: 1.方法一 WITH A AS (SELE ...

  5. 用mysql触发器实现log记录

    首先建立两张测试用表 mysql> desc pay; +-------+---------------+------+-----+---------+----------------+ | F ...

  6. removeNode is not defined removeNode is not a function

    在javascript操作dom树的时候可能会经常遇到增加,删除节点的事情,比如一个输入框后一个增加按钮,一个删除按钮,点击增加就增加 个输入框,点击删除就删除对应的输入框.在一些js框架,如Prot ...

  7. spring WebSocket详解

    场景 websocket是Html5新增加特性之一,目的是浏览器与服务端建立全双工的通信方式,解决http请求-响应带来过多的资源消耗,同时对特殊场景应用提供了全新的实现方式,比如聊天.股票交易.游戏 ...

  8. 纯手工打造漂亮的垂直时间轴,使用最简单的HTML+CSS+JQUERY完成100个版本更新记录的华丽转身!

    前言 FineUI控件库发展至今已经有 5 个年头,目前论坛注册的QQ会员 5000 多人,捐赠用户 500 多人(捐赠用户转化率达到10%以上,在国内开源领域相信这是一个梦幻数字!也足以证明Fine ...

  9. QTableView 一列添加两个按钮

    在QTableView的一列里添加两个按钮,之前添加一个按钮的思路是一样的,只是计算了一下按钮的宽,放两个按钮而已. 添加一个按钮的例子:QTableView 添加按钮 本例源代码:QtTowButt ...

  10. window.location.href = window.location.href 跳转无反应 a 超链接 onclick 点击跳转无反应

    错误写法 , 主要是在 href="#"这里 <a href="#" id="send" onclick="return b ...