JavaScript ES6 Array and Object Destructuring Assignment 陣列和物件的解構賦值

ES6 的 destructuring assignment,可以用來從陣列或物件中抽取 (destructuring) 值出來指定 (assignment) 給變數。

Array Destructuring 陣列的解構賦值

在 ES6 之前,賦值給一個變量,只能用指定的方式:

var one = 'one';
var two = 'two';
var three = 'three';

ES6 你可以用 Destructuring 的語法:

var foo = ['one', 'two', 'three'];

// 從 array 中提取值,然後按照對應的位置,指定給相應的變數
var [one, two, three] = foo;

// "one"
console.log(one);

// "two"
console.log(two);

// "three"
console.log(three);

另外一個使用的例子:

function foo() {
    return [1, 2, 3];
}

// [1, 2, 3]
var arr = foo();

var [a, b, c] = foo();

// 顯示 1 2 3
console.log(a, b, c);

也可以有預設值 (default value):

var [a=5, b=7] = [1];

// 1
console.log(a);

// 7
console.log(b);

可以留空來略過某些值:

function f() {
  return [1, 2, 3];
}

// 跳過第二個值
var [a, , b] = f();

// 1
console.log(a);

// 3
console.log(b);

搭配 Rest Operator

var [a, ...b] = [1, 2, 3];

// 1
console.log(a);

// [2, 3]
console.log(b);

Object Destructuring 物件的解構賦值

Destructuring 不僅可以用在 array,也可以用在 object:

var o = {p: 42, q: true};

// 從物件 o 中取出 key 為 p 和 q 的值,指定給變數 p 和 q
var {p, q} = o;

// 42
console.log(p);

// true
console.log(q);

也可以取值給已經宣告過的變數:

var a, b;

// 小括號 () 是必要的,不然左邊的 {} 會 SyntaxError 被當作是 block 區塊宣告
({a, b} = {a: 1, b: 2});

你的變數名稱可以和被取值的 object key 使用不同的名稱:

var o = {p: 42, q: true};

// 取出 key 名稱為 p 的值,指定給變數 foo
// 取出 key 名稱為 q 的值,指定給變數 bar
var {p: foo, q: bar} = o;

// 42
console.log(foo);

// true
console.log(bar);

也可以有預設值 (default value):

var {a = 10, b = 5} = {a: 3};

// 3
console.log(a);

// 5
console.log(b);

其實只要兩邊的結構 (patterns) 一樣,左邊的變數就會被賦予對應的值,所以用在 nested object 或 array 也行:

var obj = {
    p: [
        'Hello',
        {
            y: 'World'
        }
    ]
};

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

// "Hello"
console.log(x);

// "World"
console.log(y);

還可以用在函數的參數列上:

function drawES2015Chart({size = 'big', cords = {x: 0, y: 0}, radius = 25} = {}) {
    console.log(size, cords, radius);
}

// 輸出 big {x: 18, y: 30} 30
drawES2015Chart({
    cords: {x: 18, y: 30},
    radius: 30
});

上面的例子中 = {} 這語法是 ES6 新的 Default Function Parameters

IE 最新版瀏覽器 IE11 目前還不支援 Destructuring。