ES6解构赋值规则:
1:左右两边结构必须一样
2:右边必须是个东西(数组、对象、json...)
3:声明和赋值不能分开,必须在一句话内完成
例如:
let [a,b,c]=[1,2,3];//数组解构赋值
let [q,w,e]={q:12,w:24,e:36};//json的结构赋值
let [{a,b,c},[d,e,f],g,h]=[{a:1,b:2,c:3},[1,2,3],'hello',5]
--1:数组的结构赋值:
es6允许按照一定的模式,从数组和对象中提取值,对变量进行赋值,这被称为解构赋值。
本质上属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。
例1:
let arr=[16,17,18,19]
let [x,y,z,q]=arr;//左右两边一一对应
log(x) //16
log(y) //17
log(z) //18
log(q) //19
--以下是一些嵌套的结构赋值:
例2:
let [a,b,c]=[1,[2,3,4],5];//a=1,b=[2,3,4],c=5
例3:
let [a1,[b1,d1,f1],c1]=[1,[2,3,4],5];//依旧遵循一一对应原则,依次为1,2,3,4,5,
例4:
let [,,name]=['朱雀','青龙','白虎']
log('name:'+name)//白虎
例5:
let [gg,...hh]=[1,2,3,4,5] //使用了数组的扩展运算符
log(gg)//1
log(hh)//arr[2,3,4,5]
例6:
let [y1,,...y2]=[1,2,3,4,5]
log(y1)//1
log(y2)//arr[3,4,5]
例7:
let [i1,i2,...i3]=['hello']
log(i1)//hello
log(i2)//undefined
log(i3)//[]
注:如果解构不成功那么,值为undefined
--不完全解构情况:
还存在一种不完全解构的情况,即等号左边的模式,只匹配一部分右边的数组,这种情况下,解构依然可以成功。
例1:
let [new1,new2,new3]=['hello','world']
log(new1)//hello
log(new2)//world
log(new3)//undefined
例2:
let [aa1,[aa2],aa3]=[1,[2,3],4]
log(aa1)//1
log(aa2)//2
log(aa3)//4
--如果等号右边不是数组,严格的说不是可遍历的结构那么将会报错
例如:
let [foo]=1 //1 is not iterable!
let [foo]=false //false is not iterable!
let [foo]=null //null is not iterable!
let [foo1]=undefined //undefined is not iterable!
let [foo2]={} //[object Object] is not iterable!
let [foo3]=NaN // NaN is not iterable!
--对于Set结构也可以采用数组的解构赋值:
log('Set解构赋值')
let [s1,s2,s3]=new Set([1,2,3])
log(s1)//1
log(s2)//2
log(s3)//3
--事实上只要某种数据结构具有Iterator接口,都可以采用数组形式的结构赋值
--对象的解构赋值:
对象的解构赋值与数组的解构赋值有一个很大的不同,数组的元素是按次序排列的,变量的取值由他的位置决定,而对象的属性没有次序,变量必须与属性同名才能取到正确的值。
例1:
let {log}=console
let obj={
name:'朱雀',
desc:"南方星圣"
}
let {desc,name}=obj
log('name'+name)//朱雀
log('desc'+desc)//南方星圣
注:对象解构赋值等号两边的顺序可以不一致,但一定要保证同名
例2:
let {hello}={text:'hello,world'}
log(hello)//undefined
注: 没有同名的属性,取不到值为undefined
例3:
let {max,min,abs}=Math
log(max(5,9,4,6,8))//9
log(min(5,9,4,6,8))//4
log(abs(-6))//6
如上,除了解构我们自定义对象外,还可以解构js的自带对象,例如Math,console,Array等对象,通过解构赋值将这些对象的属性或方法赋值给我们定义的变量,以达到简写的目的,这样使用起来就会很方便
例4:
let {pet:petName,lvl:petLvl}={pet:'青龙',lvl:120}
log(petName)//青龙
log(petLvl)//120
上面例1我们提到了等号两边名称必须一致,实际上也可以不一致,但必须写成例4这样。
对象的解构赋值是let {pet:petName,lvl:petLvl}={pet:'青龙',lvl:120}这种形式的简写,es6对对象进行了一些扩展,如果对象的属性和属性值一样,允许简写成一个。
注:
1:对象解构赋值的内部机制是:先找到同名属性,然后再赋给对应的变量,真正被赋值的是属性的值,而不是属性名。
2:对象的解构赋值可以取到继承的属性。
--字符串的解构赋值
字符串也可以进行解构赋值,字符串在进行解构赋值时会被转换成一个类似数组的对象,类似数组的对象都具有一个length属性,因此也可以对这个Length属性进行解构。
let {log}=console
const [a,b,c,d,e,f]='hello'
log(a)//h
log(b)//e
log(c)//l
log(d)//l
log(e)//o
log(f)//undefined
let {length}='hello'
log(length)//5
--函数参数的解构赋值
函数的参数也可以进行解构赋值。
例如:
let {log}=console
function add([x,y]){
return x+y
}
log(add([1,3]))//4
上面的函数参数表面上是一个数组,实际上在传参后,参数就被解构成了x,y
函数参数的解构也可以使用默认值。
function move({x=0,y=0}={}){
return [x,y]
}
log(move({x:1,y:1}))//[1,1]
log(move({x:1}))//[1,0]
log(move({}))//[0,0]
log(move())//[0,0]
--解构赋值的用途:
1:交换变量值(以往es5交换变量我们需要一个中间值,es6则无需中间值,写法简单语义清晰)
let x=1;
let y=2;
[x,y]=[y,x]
log('解构后x,y:')
log(x)
log(y)
2:函数参数的定义(解构赋值可以方便的将一组参数与变量名对应起来)
3:函数返回多个值
函数只能返回一个值,要返回多个值就需要将他们放在数组或对象内,通过解构赋值我们可以方便的取出这些值
function fun(){
return [1,2,3]
}
let [x,y,z]=fun()
function fun2(){
return {
name:'朱雀',
desc:'南方星圣'
}
}
let {name,desc}=fun2()
4:函数参数设置默认值
以往es5时我们要给函数参数设置默认值需要:var x=x||2;这样的语句,非常麻烦
通过解构赋值我们就可以方便快捷的为函数设置默认值
function fun({
url:'http://www.baicu.com',
data:'1'
}){}
5:提取json数据
6:输入模块的指定方法
const {log} =console