ES6:解构赋值

本文参考《es6入门标准》来写。

01-解构赋值初识
ES6允许按照一定模式,从数组和对象中提取值,对变量进行性赋值,
这被称为解构。

以前为变量赋值,只能直接指定值。

eg1:{
    let a = 1,
    b = 2,
    c = 3;
}

eg2: {
    let [a,b,c] = [1,2,3];
}

这种语法,可以从数组中提取值,按照对应位置,对变量赋值。
本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。

02-数组的解构赋值
两个例子:

 eg:
        let [a,[[b],c]] = [1,[[2],3]];
        
        

        let [x, ...y] = [1, 2, 3, 4];
        console.log(x,y); // 1 (3) [2, 3, 4]

01-一些特殊情况:

 如果结构不成功,变量的值就等于undefined
    let [x, y, ...z] = ['a'];
    console.log(x,y,z);  //a undefined []

    let [x, y, z] = [1,2];
    console.log(x,y,z);

    不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组。依旧ok
    let [x,y] = [1,2,3];
    console.log(x,y); // 1 2

02-解构赋值允许指定默认值

   let [x,y = 1] = ["a"]
    console.log(x,y)  // a 

    let [x,y = 1] = ["a","b"]
    console.log(x,y)  // a b

    当一个数组成员严格等于undefined,默认值才会生效。
    let [x,y = 1] = ["a",undefined]
    console.log(x,y)  // a 1

    默认值可以引用解构赋值的其他变量,但该变量必须已经声明。
     let [x = 1,y = x] = [];
    console.log(x,y);

    let [x = y,y = 1] = [];
    console.log(x,y);

03-对象的解构赋值

1.解构不仅可以用于数组,还可以用于对象

  let { foo , bar} = {foo:'aaa', bar:'bbb'};
    console.log(foo,bar);
    对象的结构赋值,变量必须与属性同名才能取到正确的值。
  let {baz} = {foo:'aaa',bar:'bbb'}
    console.log(baz)
   没有与有便同名的属性,导致取不到值,最后得到undefined
2.对象的解构赋值,可以将现有对象的方法赋值到某个变量
    let { log } = console;
    log("es6");  //将console.log()赋值到log身上

3.变量名与属性名不一致(解析赋值的实质)
   let {foo:foo} = {foo:123}
    console.log(foo); //123

    let {foo: baz} = { foo: 345};
    console.log(foo);  //foo is not defined
    console.log(baz);

    实际上说明对象的解构赋值是下面形式的简写
    内部机制为,先找到同名属性,然后赋值给对应的变量。
    真正被赋值的是变量,而不是这个属性
4.对象的解构赋值也可以用于嵌套的对象
  let obj = {
        p:[
            'hello',
            {
                y:'world'
            }
        ]
    };

    let { p:[x,{ y }] } = obj;

    console.log("x:"+x,"y:"+y);
5.默认值
 let {x = 3} = {};
    console.log(x) // 3

    let {x, y = 5} = {1};
    console.log(x,y) // 1 5

04-字符串解构赋值
1.字符串也可以结构赋值,这是因为欸此时,字符串被转化为了一个类似数组的对象。

const [a,b,c,d,e] = 'hello';
    console.log(a,b,c,e,d); //h e l o l

2.类似数组的对象都有一个length属性,还可以用这个属性解构赋值

 let {length : len} = 'hello'
    console.log(len)  //5

05-函数参数的解构赋值

function add([x,y]){
        return x + y;
    }
    add([2,3]);  //5

06-解构赋值的用途
1,交换变量的值

  let x = 1,
        y = 2;
    console.log("x:"+x,"y:"+y);
    [x,y] = [y,x];
    console.log("x:"+x,"y:"+y);

2.从函数返回多个值
函数只能返回一个值,如果要返回多个值,只能将它们放在数组
或对象里返回。有了解构赋值,取出这些值就非常方便。
 返回一个数组
    function arr1(){
        return [1,2,3];
    }
    let [ a,b,c] = arr1();
    console.log(a,b,c);

    返回一个对象
    function obj1(){
        return {
            first_name:'james',
            last_name:'john'
        };
    }

    let {first_name,last_name} = obj1();
    console.log(first_name,last_name);
3.函数参数的定义
解构赋值可以将一组参数和变量名对应起来
    function f([x,y,z]){
        console.log(x+y+z);
    }
    f([1,2,3]);  //6
4.提取json数据
解构赋值对提取json对象中的数据,尤其有用
  let jsonDate = {
        id:42,
        name:'kjh',
        status:'ok',
        data:[867,5309]
    };
    let {id, name, status,data} = jsonDate;
    console.log(id, name, status,data); //42 "kjh" "ok" (2) [867, 5309]

5.遍历map结构
   const map = new Map();
    map.set('first','hello');
    map.set('second','world');

    for(let [key,value] of map){
        console.log(key + 'is' + value);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值