解构

解构赋值

将数组的元素同时赋给多个变量;

1
2
// 如果浏览器支持解构赋值就不会报错:
var [x, y, z] = ['hello', 'JavaScript', 'ES6'];

解构赋值可以进行灵活的运用,比如对二维数组进行解构:

1
2
3
4
let [x, [y, z]] = ['hello', ['JavaScript', 'ES6']];
x; // 'hello'
y; // 'JavaScript'
z; // 'ES6'

忽略部分元素,只解构出一部分元素:

1
2
let [, , z] = ['hello', 'JavaScript', 'ES6']; // 忽略前两个元素,只对z赋值第三个元素
z; // 'ES6'

解构对象

解构对象需要使用对应的属性名,并且用大括号括起来;

1
2
3
4
5
6
7
8
9
10
'use strict';

var person = {
name: '小明',
age: 20,
gender: 'male',
passport: 'G-12345678',
school: 'No.4 middle school'
};
var {name, age, passport} = person;

同样,对于嵌套的对象,也可以解构出其嵌套值;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var person = {
name: '小明',
age: 20,
gender: 'male',
passport: 'G-12345678',
school: 'No.4 middle school',
address: {
city: 'Beijing',
street: 'No.1 Road',
zipcode: '100001'
}
};
var {name, address: {city, zip}} = person;
name; // '小明'
city; // 'Beijing'
zip; // undefined, 因为属性名是zipcode而不是zip
// 注意: address不是变量,而是为了让city和zip获得嵌套的address对象的属性:
address; // Uncaught ReferenceError: address is not defined

解构对象时,并不一定要于对象的的属性名一致,可以另外指定其他变量来接收解构的属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var person = {
name: '小明',
age: 20,
gender: 'male',
passport: 'G-12345678',
school: 'No.4 middle school'
};

// 把passport属性赋值给变量id:
let {name, passport:id} = person;
name; // '小明'
id; // 'G-12345678'
// 注意: passport不是变量,而是为了让变量id获得passport属性:
passport; // Uncaught ReferenceError: passport is not defined

可以给要获取解构的属性的变量设置默认值:

1
2
3
4
5
6
7
8
9
10
11
var person = {
name: '小明',
age: 20,
gender: 'male',
passport: 'G-12345678'
};

// 如果person对象没有single属性,默认赋值为true:
var {name, single=true} = person;
name; // '小明'
single; // true

  • 解构对象时注意点

对于已经声明的变量,用它们来接收解构属性时,需要用括号括起,表示是一个运行语句,而不是代码块:

1
2
3
4
5
// 声明变量:
var x, y;
// 解构赋值:
{x, y} = { name: '小明', x: 100, y: 200};
// 语法错误: Uncaught SyntaxError: Unexpected token =

因为JavaScript引擎把{开头的语句当作了块处理,于是=不再合法。

1
2
正确写法:
({x, y} = { name: '小明', x: 100, y: 200});