变量的解构赋值

ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。

解构:分解数据结构;赋值:给变量赋值。

数组的解构赋值

语法

在 ES5 中,当我们在为一组变量赋值时,一般是这样写:

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

在 ES6 中,通过解构赋值,可以这么写:(按照位置顺序一一对应)

var [a, b, c] = [1, 2, 3];
console.log(a);		//1
console.log(b);		//2
console.log(c);		//3

未匹配到的情况

数据的解构赋值,是根据位置进行一一对应来赋值的。如果表达式左边的变量的数量 大于 表达式右边的变量的数量,那么多余的变量会被赋值为 undefined

let [a, b] = [1];
console.log(a);		//1
console.log(b);		//undefined

默认值

在解构赋值时,是允许使用默认值的。

{
	let [a = 1, b = 2] = [];
    console.log(a);		//1
    console.log(b);		//2
}

{
	let [a, b = 'bar'] = ['foo'];	//a被赋值为'foo',b采用默认值'bar'
    console.log(a);		//foo
    console.log(b);		//bar
}

将右边的 undefinednull 赋值给变量

{
	let [a, b = 'bar'] = ['foo', undefined];	//b虽然被赋值undefined,但仍采用默认值'bar'
    console.log(a);		//foo
    console.log(b);		//bar
}

{
	let [a, b = 'bar'] = ['foo', null];	//a被赋值为'foo',b被赋值为null
    console.log(a);		//foo
    console.log(b);		//null
}

对象的解构赋值

语法

在 ES5 中,我们从接口拿到 json 数据后,一般这么赋值:

let name = json.name;
let age  = json.age;
let sex = json.age;

在 ES6 中,通过解构赋值,可以这么写:

let person = { name: 'Tom', age: 12, sex: 'man' };
let { name, age, sex } = person;
console.log(name);		//Tom
console.log(age);		//12
console.log(sex);		//man

对象的解构赋值与数组的解构赋值不同是:数组是按照位置顺序一一对应的,而对象是按照属性名来对应的。也就是说对象的解构赋值只要表达式的左右两边的属性名相同就行,和位置顺序无关。

未匹配到的情况

对象的解构赋值,是按照属性名一一对应来赋值的。如果表达式左边的变量的数量 大于 表达式右边的变量的数量,那么多余的变量同样会被赋值为 undefined

给左边的变量自定义命名

在对象的解构赋值时,还可以给表达式左边的变量设置自定义的名字

{
    let person = { name: 'Tom', age: 12, sex: 'man' };
    let { name: myname, age: myage, sex: mysex } = person;
    console.log(myname);	//Tom
    console.log(myage);		//12
    console.log(mysex);		//man
    console.log(name);		//Uncaught ReferenceError: name is not defined
    console.log(age);		//Uncaught ReferenceError: age is not defined
    console.log(sex);		//Uncaught ReferenceError: sex is not defined
}

{
    let person = { name: 'Tom', age: 12 };
    // 对象解构赋值同样可以给变量设置默认值
    let { name: myname, age: myage, sex:mysex = 'man' } = person;
    console.log(myname);	//Tom
    console.log(myage);		//12
    console.log(mysex);		//man
}

圆括号的使用

如果变量 name 在解构前就已经定义了,此时你再去解构,就会出现问题。下面的代码,在编译时会报错。

let name = 'Jerry';
{ name } = { name: 'Tom'};

只要在解构赋值的表达式外面加上括号就可以解决:

let name = 'Jerry';
({ name } = { name: 'Tom'});
console.log(name);		//Tom

字符串的解构赋值

字符串也可以解构赋值,和数组的解构赋值类似。

let [a, b, c] = 'hello';
console.log(a);			//h
console.log(b);			//e
console.log(c);			//l
console.log(typeof a);	//string