# 多变量的模式赋值

ES6允许按照一定模式,一次性对多个变量进行赋值,这又称为解构(Destructuring)。

正常情况下,为多个变量赋值,只能一次次分开赋值。

```javascript

var a = 1;
var b = 2;
var c = 3;

```

ES6允许写成下面这样。

```javascript

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

```

本质上,这种写法属于模式匹配,只要等号两边的模式相同,左边的变量就会被赋予对应的值。下面是一些嵌套数组进行模式赋值的例子。

```javascript

var [foo, [[bar], baz]] = [1, [[2], 3]]

var [,,third] = ["foo", "bar", "baz"]

var [head, ...tail] = [1, 2, 3, 4]

```

模式赋值还允许指定默认值。

```javascript

var [missing = true] = [];

console.log(missing)
// true

var { x = 3 } = {};
console.log(x)
// 3

```

模式赋值不仅可以用于数组,还可以用于对象。

```javascript

var { foo, bar } = { foo: "lorem", bar: "ipsum" };

foo // "lorem"
bar // "ipsum"

var o = {
  p1: [
    "Hello",
    { p2: "World" }
  ]
};

var { a: [x, { y }] } = o;

x // "Hello"
y // "World"

```

这种写法的用途很多。

(1)交换变量的值

```javascript

[x, y] = [y, x]; 

```

(2)从函数返回多个值

```javascript

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

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

```

(3)函数参数的定义

```javascript

function f({p1, p2, p3}) {
  // ...
}

```

(4)函数参数的默认值

```javascript

jQuery.ajax = function (url, {
  async = true,
  beforeSend = function () {},
  cache = true,
  complete = function () {},
  crossDomain = false,
  global = true,
  // ... more config
}) {
  // ... do stuff
};

```