1.数组的解构赋值
基本用法
ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
例如:
let [a,b,c] = [1,2,3];
这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。
let [foo,[[bar],baz]] = [1,[[2],3]];
foo //1
bar //2
baz //3.
let [ , , third] = ["foo","bar","baz"];
third //"baz"
let [head, ...tail] = [1,2,3,4];
head //1
tail //[2,3,4]
对于Set结构,也可以使用数组的解构赋值
let [x,y,z] = new Set(['a','b','c']);
x //"a"
只要某种数据结构具有Iterator借口,都可以采用数组形式的解构赋值。
默认值
解析赋值允许指定默认值。
let [foo = true] = [];
foo //true
- 如果一个数组成员是null,默认值就不会生效,因为null不严格 等于undefined。
- 如果默认值是一个表达式,它是惰性求值的,用到的时候才会求值。
- 默认值可以引用解构赋值的其他变量,但该变量必须已经声明。
2.对象的解构赋值
对象的解构是按照变量与属性同名的才能取到正确的值,而数组是按次序排列。
let {bar,foo} = {foo:'aaa','bar' : 'bbb'};
foo //"aaa"
bar //"bbb"
let {baz} = { foo:'aaa',bar:'bbb'};
baz //undefined
如果变量名与属性名不一致,必须写成下面这样。
let {foo : "baz"} = {foo:'aaa',bar:'bbb'};
baz //"aaa"
默认值
对象的解构也可以指定默认值。
默认值生效的条件是对象的属性值严格等于undefined。
3. 字符串的解构赋值
字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。
const [a,b,c,d,e] = 'hello';
a //"h"
b // "e"
c // "l"
d // "l"
e // "o"
4.数值和布尔值的解构赋值
解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。
解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined
和null
无法转为对象,所以对它们进行解构赋值,都会报错。
5.函数参数的解构赋值
function add([x,y]){
return x+y;
}
add([1,2]); //3
6.用途
- 交换变量的值
[x.y] = [y,x];
- 从函数返回多个值
//返回一个数组
function example(){
return [1,2,3];
}
let [a,b,c] = example();
//返回一个对象
function example(){
return {
foo:1,
bar:2
};
}
let {foo,bar}=example();
函数参数的定义
函数只能返回一个值,如果要返回多个值,只能将它们放在数组或对象里返回。有了解构赋值,取出这些值就非常方便。
//返回一个数组
function example(){
return [1,2,3];
}
let [a,b,c] = example();
//返回一个对象
function example(){
return {
foo:1,
bar:2
};
}
let {foo,bar} = example();
- 提取JSON数据
解构赋值对提取JSON对象中的数据尤其有用。
let jsonData = {
id:42,
status:"OK"M
data:[567,5309]
};
let {id,status,data:number}=jsonData;
console.log(id,status,number);
//42,"OK",[867,5309]
- 函数参数的默认值
- 加载模块时,往往需要指定输入哪些方法。解构赋值使得输入语句非常清晰。
const { SourceMapConsumer, SourceNode } = require("source-map");