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。