美文网首页
解构赋值

解构赋值

作者: 浅忆_0810 | 来源:发表于2020-09-28 23:14 被阅读0次

    1. 基本概念

    ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,被称之为解构


    2. 数组的解构赋值

    2.1 基本用法

    // es5一次申明多个变量
    var a = 1,
        b = 2,
        c = 3;
    
    // es6一次声明多个变量
    let [a, b, c] = [1, 2, 3];
    // a = 1
    // b = 2
    // c = 3
    

    本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。

    let [x, , y] = [1, 2, 3];
    x // 1
    y // 3
    
    let [head, ...tail] = [1, 2, 3, 4];
    head // 1
    tail // [2, 3, 4]
    
    let [x, y, ...z] = ['a'];
    x // "a"
    y // undefined
    z // []
    

    如果解构不成功,变量的值就等于undefined

    另一种情况是不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组。这种情况下,解构依然可以成功

    let [a, [b], d] = [1, [2, 3], 4];
    a // 1
    b // 2
    d // 4
    

    如果等号的右边不是数组,那么将会报错。

    // 报错
    let [foo] = 1;
    let [foo] = false;
    let [foo] = NaN;
    let [foo] = undefined;
    let [foo] = null;
    let [foo] = {};
    

    2.2 默认值

    解构赋值允许指定默认值。

    let [foo = true] = [];
    foo // true
    
    let [x, y = 'b'] = ['a']; // x = 'a', y = 'b'
    let [x, y = 'b'] = ['a', undefined]; // x = 'a', y = 'b'
    

    3. 对象的解构赋值

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

    let { foo, bar } = { foo: "aaa", bar: "bbb" };
    foo // "aaa"
    bar // "bbb"
    

    对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。

    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"
    

    实际上说明,对象的解构赋值是下面形式的简写

    let { foo: foo, bar: bar } = { foo: "aaa", bar: "bbb" };
    

    也就是说,对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者.

    let { foo: baz } = { foo: "aaa", bar: "bbb" };
    baz // "aaa"
    foo // error: foo is not defined
    

    与数组一样,解构也可以用于嵌套结构的对象。

    let obj = {
      p: [
        'Hello',
        { y: 'World' }
      ]
    };
    
    let { p: [x, { y }] } = obj;
    x // "Hello"
    y // "World"
    

    对象的解构也可以指定默认值。

    var { x, y = 5 } = { x: 1 };
    x // 1
    y // 5
    
    var { message: msg = 'Something went wrong' } = {};
    msg // "Something went wrong"
    

    默认值生效的条件是,对象的属性值严格等于undefined

    var { x = 3 } = { x: undefined };
    x // 3
    
    var { x = 3 } = { x: null };
    x // null
    

    由于数组本质是特殊的对象,因此可以对数组进行对象属性的解构

    let arr = [1, 2, 3];
    let { 0: first, [arr.length - 1]: last} = arr;
    first // 1
    last // 3
    

    4. 字符串的解构赋值

    const [a, b, c, d, e] = 'hello';
    a // "h"
    b // "e"
    c // "l"
    d // "l"
    e // "o"
    

    类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。

    let { length: len } = 'hello';
    len // 5
    

    5. 函数参数的解构赋值

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

    函数参数的解构也可以使用默认值。

    function move({x = 0, y = 0} = {}) {
      return [x, y];
    }
    
    move({x: 3, y: 8}); // [3, 8]
    move({x: 3}); // [3, 0]
    move({}); // [0, 0]
    move(); // [0, 0]
    

    注意,下面的写法会得到不一样的结果

    function move({x, y} = { x: 0, y: 0 }) {
      return [x, y];
    }
    
    move({x: 3, y: 8}); // [3, 8]
    move({x: 3}); // [3, undefined]
    move({}); // [undefined, undefined]
    move(); // [0, 0]
    

    上面代码是为函数move的参数指定默认值,而不是为变量xy指定默认值,所以会得到与前一种写法不同的结果。


    6. 用途

    1. 除了可以一次定义多个变量
    2. 还可以让函数返回多个值
    3. 可以方便地让函数的参数跟值对应起来
    4. 提取json数据
    5. 函数参数的默认值

    相关文章

      网友评论

          本文标题:解构赋值

          本文链接:https://www.haomeiwen.com/subject/flpyuktx.html