ES6解构赋值

  1. 数组的解构赋值

    1
    2
    3
    4
    5
    6
    7
    8
    let [head, ...tail] = [1, 2, 3, 4];
    head // 1
    tail // [2, 3, 4]

    let [x, y, ...z] = ['a'];
    x // "a"
    y // undefined
    z // []
  2. 对象的解构赋值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    let { foo, bar } = { 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 obj = { first: 'hello', last: 'world' };
    let { first: f, last: l } = obj;
    f // 'hello'
    l // 'world'

    // 对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。
    // foo是匹配的模式,baz才是变量。真正被赋值的是变量baz,而不是模式foo。
    let { foo: baz } = { foo: "aaa", bar: "bbb" };
    baz // "aaa"
    foo // error: foo is not defined

    // 与数组一样,解构也可以用于嵌套结构的对象。
    let obj = {
    p: [
    'Hello',
    { y: 'World' }
    ]
    };
    let { p, p: [x, { y }] } = obj;
    x // "Hello"
    y // "World"
    p // ["Hello", {y: "World"}]