ES6入门(2)解构赋值

2019/02/27 22:29 下午 posted in  ES6

解构赋值语法是一个 Javascript 表达式,这使得可以将值从数组或属性从对象提取到不同的变量中。

语法

let a, b, rest;
[a, b] = [10, 20];
console.log(a); // 10
console.log(b); // 20

[a, b, ...rest] = [10, 20, 30, 40, 50];
console.log(a); // 10
console.log(b); // 20
console.log(rest); // [30, 40, 50]

({ a, b } = { a: 10, b: 20 });
console.log(a); // 10
console.log(b); // 20


// Stage 3 proposal
({a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40});
console.log(a); // 10
console.log(b); // 20
console.log(rest); //{c: 30, d: 40}

数组的解构赋值

    let arr = [1,2,3,4,5];
    // let x=arr[0];
    // let y=arr[1];
    // let m=arr[2];
    // let n=arr[3];
    let [x,y,m,n] = arr;
    console.log(x,y,m,n);
    // 设置默认值
    // let [x1,x2=10]=[1];
    // console.log(x1,x2);
    // 是先赋值默认值再被覆盖还是?
    let [X1,X2=(function () {console.log('haha')();return 10;})] = [1,12];
    console.log(X1,X2); // 1 12
    // 只有后面解构的值是undefined的时候才会走默认值

    // 省略赋值
    let [,,m2] = [1,2,3];
    console.log(m2); // 3

    // 不定参数赋值 将湖面的项放在一个数组中赋值给y3
    let [y1,y2,...y3] = [1,2,3,4,5];
    console.log(y3); // array(3,4,5)

对象的解构赋值

  // 如果变量名和属性名一致,可以直接省略写法
    let {name:name,age:age}={name:"珠峰",age: 10}
    let {name,age}={name:"珠峰",age: 10};
    console.log(name,age);

    // 默认值
    let {name,age=100}={name:"珠峰"};
    let {name,age=100}={name:"珠峰",age:undefined};
    console.log(name,age);


    // 嵌套
    let {name,age=100,list:[a1,a2,a3,a4]}={name:"珠峰",age:undefined,list:['JS','NODE','vue','react']};
    console.log(name,age,a1,a2,a3,a4);



    let x1,x2;
    [x1,x2] = [1,2];

    {} 开头是块级作用域不能这样 需要用()括起来
    // let x1,x2;
    // {x1,x2} = {x1:1,x2:2};

    let x1,x2;
    ({x1,x2}= {x1:1,x2:2});
    console.log(x1,x2);

其他数据类型解构赋值

    // 使用数组解构赋值的形式,如果右边不是一个数组,默认将其转换为类数组(类似数组的对象,必须有个Length属性)
    // let [x,y] = '1'; // 不行
    let [x,y] = '123';
    console.log(x,y); // 1 2

    // 适用对象的解构赋值模式 ,如果右边不是一个对象,默认个将其转换为一个对象,再进行解构赋值
    let {a} = 1;
    console.log(a);
    console.log(Object(1)); // 有个{__proto__: } 属性
    let {__proto__:a} = 1;
    console.log(a);

    let {length:b} = '1234';
    console.log(Object("1234"));
    console.log(b);

函数类型机构赋值


    function getA([a,b,c,...d]){
        console.log(a,b,c,d);
    }
    getA([1,2,3,4,5]);  // 1 2 3 [4,5]

    function getB({name,age}) {
        console.log(name,age)
    }
    getB({name:"珠峰",age:10}); // 珠峰 10

    // 默认值
    function getC({name="珠峰",age=100}) {
        console.log(name,age)
    }
    getC({name:"珠峰"}); // 珠峰 100
    getC({}); // 珠峰 100

    // 默认值
    function getD({name="珠峰",age=100}={}) {
        console.log(name,age)
    }
    getD(); // 珠峰 100

    function getD1({name,age}={name:"珠峰",age:100}) {
        console.log(name,age);
    }

    getD();     // 珠峰 100
    getD1();    // 珠峰 100
    getD({});   // 珠峰 100
    getD1({});  // undefined undefined

注意 getD()getD1()在参数是{}的时候结果是不同的