数组解构只要等号两边的模式相同,左边的变量就会被赋值相应的值。让[a,b,c]=[1,2,3];如果解构不成功,则变量的值等于undefined。让[foo,[[bar],baz]]=[1,[[2],3]];foo//1bar//2baz//3let[,,third]=["foo","bar","baz"];third//"baz"let[head,...tail]=[1,2,3,4];head//1tail//[2,3,4]let[x,y,...z]=['a'];x//"a"y//undefinedz//[]在解构不完全的情况下,解构还是可以成功的。也就是说,等号左边的模式只匹配等号右边数组的一部分。让[a,[b],d]=[1,[2,3],4];a//1b//2d//4解构赋值允许指定默认值ES6在内部使用严格的相等运算符(===)来确定一个位置是否有值。因此,只有当一个数组成员严格等于undefined时,默认值才会生效。让[x,y='b']=['a'];//x='a',y='b'让[x,y='b']=['a',undefined];//x='a',y='b'让[x=1]=[null];//x=null如果默认值是一个表达式,那么这个表达式是惰性求值的,即只有当它到达时,才会对值求值。functionf(){console.log('aaa');}让[x=f()]=[1];上面代码中,因为x可以取到值,所以根本不会执行函数f。默认值可以引用解构赋值的其他变量,但必须声明该变量。让[x=1,y=x]=[];//x=1;y=1让[x=1,y=x]=[2];//x=2;y=2让[x=1,y=x]=[1,2];//x=1;y=2让[x=y,y=1]=[];//ReferenceError:yisnotdefinedobjectdeconstruction一个重要的区别。数组的元素是有序排列的,变量的值由它的位置决定;而对象的属性没有顺序,变量必须和属性同名才能得到正确的值。如果解构失败,则变量的值等于未定义。let{bar,foo}={foo:'aaa',bar:'bbb'};foo//"aaa"bar//"bbb"let{baz}={foo:'aaa',bar:'bbb'};baz//undefined如果变量名和属性名不一致,必须这样写。let{foo:baz}={foo:'aaa',bar:'bbb'};baz//"aaa"letobj={first:'hello',last:'world'};let{first:f,last:l}=obj;f//'hello'l//'world'即对象解构赋值的内部机制是先找到同名属性,然后赋值给对应的多变的。实际分配的是后者,而不是前者。let{foo:baz}={foo:'aaa',bar:'bbb'};baz//"aaa"foo//error:fooisnotdefined就像数组一样,解构也可以用于具有嵌套结构的对象.letobj={};letarr=[];({foo:obj.prop,bar:arr[0]}={foo:123,bar:true});obj//{prop:123}arr//[true]注意对象的解构赋值可以获得继承的属性。constobj1={};constobj2={foo:'bar'};Object.setPrototypeOf(obj1,obj2);const{foo}=obj1;foo//解构“bar”对象也可以指定默认值默认值生效条件是对象的属性值严格等于(===)undefined。var{x,y=5}={x:1};x//1y//5var{x=3}={x:null};x//null如果要使用已经声明的变量进行解构赋值,整个解构赋值语句必须放在括号中才能正确执行。让x;{x}={x:1};//SyntaxError:语法错误//正确的写法letx;({x}={x:1});因为JavaScript引擎会将{x}理解为代码块,从而导致语法错误。这个问题只能通过不在行首写大括号来解决,避免JavaScript将其解释为代码块。解构赋值的目的1.交换变量值letx=1;让y=2;[x,y]=[y,x];2.取出函数返回的多个值//返回一个数组functionexample(){return[1,2,3];}let[a,b,c]=example();//返回一个对象functionexample(){return{foo:1,bar:2};}let{foo,bar}=example();3.函数参数传递//参数是一组有序值functionf([x,y,z]){...}f([1,2,3]);//参数是一组无序值函数f({x,y,z}){...}f({z:3,y:2,x:1});4.提取JSON数据解构赋值对提取对JSON对象中的数据特别有用。让jsonData={id:42,status:"OK",data:[867,5309]};let{id,status,data:number}=jsonData;console.log(id,status,number);//42,"OK",[867,5309]5.输入模块指定方法对象的解构赋值,可以方便地将已有对象的方法赋值给某个变量。加载模块时,通常需要指定要导入哪些方法。解构赋值使得输入语句非常清晰。让{log,sin,cos}=数学;const{SourceMapConsumer,SourceNode}=require("source-map");参考链接:变量的解构赋值
