es6(三:解构赋值)

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值