ES6变量的解构赋值本质上是“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予匹配的右边的值,若是匹配不成功变量的值就等于undefined数组
ES6中只要某种数据有Iterator接口(也就是能够循环迭代),均可以进行数组的解构赋值。
Example1:数组的解构浏览器
var [a,b,c] = [1,2,3]; var [d,[e],...f] = [4,[5],6,7,8]; console.log(a); //结果为1,b,c结果是2,3 console.log(e,f) //e结果为5,f的结果是一个数组:[6,7,8]
Example2:Set解构赋值babel
let [x,y] = new Set([1,2]); console.log(x,y); //结果为1和2
Example3:Generator函数解构赋值函数
function* fun(){ let a = 0; let b = 1; while(true){ yield a; [a,b] = [b,a+b]; } } let [first,second,third,fourth,fifth,sixth] = fun(); console.log(sixth); //结果为5
Example4:默认值code
var [a=3,b=5] = [undefined,4]; console.log(a,b); //结果为3和4
代码解读:上面的代码等同于以下:
Example4:对象
var a; var b; var c = [undefined,4]; //这步骤是另加上去做为数组引用的 if(c[0] !== undefined){ a = c[0]; }else{ a = 3; } if(c[1] !== undefined){ b = c[1]; }else{ b = 5; } console.log(a,b); //结果为3,4
数组的解构是按次序排列的,变量取值由位置决定的,而对象的属性是没有顺序的,变量必须与属性同名才能取到正确的值。接口
Exampleip
var {b,a} = {a:3,b:4} console.log(a,b); //结果为3,4
代码解读:上面的代码等同下面的代码
Example开发
var _ab = {a:3,b:4}; var b = _ab.b; var a = _ab.a; console.log(a,b); //结果为3,4
注意:对象的解构至关于先定义了后一个对象变量为_ab,再对前一个对象解构出来的变量按照对象前后顺序分别进行申明并使用对象_ab去按照该变量名赋值相应的值。若是前一个对象中的变量和后一个对象中的属性不一致,直接定义是确定赋值失败的,解决方法以下:
Example字符串
var {b:c,a:d} = {a:3,b:4}; console.log(b,c,a,d) // 分别是undefined,4,undefined,3
代码解读:上面代码等同下面的代码
Example
var _ab = {a:3,b:4}; var c = _ab.b; var d = _ab.a; console.log(b,c,a,d) // 分别是undefined,4,undefined,3
注意:例子能够看出对象的解构的内部机制是先找到同名属性,而后再赋予相应的变量,真正被赋予的是前一个对象的后一个变量,即c,d;而不是前一个对象的前一个模式,即b,a;
var e = {b:c,a:d} = {a:3,b:4}; console.log(e.b,b,c,e.a,a,d) // 分别是4,undefined,4,3,undefined,3
注意:以上代码在使用babel转换的时候可能会出错,只在浏览器中有用,因此最好不要代码中使用,只理解就好
Example1:数组
let a; [a] = [3] console.log(a); //结果为3
Example2:对象
let a; {a} = {a:3} console.log(a); // 报错:SyntaxError
代码解读:JavaScript引擎会将[a]理解成一个数组,而将{a}理解成什么呢?对于{a}这个代码在JS中可能会存在两种解释,一种是它是一个表达式,表示含有a属性的一个对象;第二种它是一个语句(代码块),为了消除这种歧义,js开发人员规定只要行首是大括号的,一概解析成代码块。解决上诉问题的代码以下:
Example3:对象
let a; ({a} = {a:3}) //JS中括号中的都是表达式 console.log(a); // 结果3
Example
let [(a)] = [1]; let {(b):c} = {b:2}; let {d:(e)} = {d:2}; //都报错:SyntaxError
注意:以上出现错误的缘由都是:一、它们都是申明语句;二、圆括号中的都属于模式中的一部分。要同时不知足以上两个条件是比较困难的,因此,ES6规定,只要可能致使解构歧义就不得使用圆括号。因此,建议在写的过程当中除了上面的那个对象圆括号的例子可使用外,其余的状况都不能使用。