ES6允许按照一定的模式,从数组和对象中提取值;对变量进行赋值;这被称为解构(Destructuring);
let [a,b,c]=[1,2,3];
可以使用这个方式进行赋值;
本质上,这种写法属于模式匹配;只要等号两边的模式相等;左边的变量就会被赋予相应的值
如果解构不成功;变量的值就是undefined;
let [foo]=[]
;
let [bar,foo]=[1];
以上的foo的值都会等于undefined;
关于Set结构,也可以使用Set的结构;
let [a,b,c]=new Set(['x','y','c']);
x;//'a';
事实上;只要某种数据结构具有Iterator接口;都可以采用数据形式的解构赋值;
function* fibs(){
let a=0;
let b=1;
while(true){
yield a;
[a,b]=[b,a+b];
}
}
let [first,second,third,fourth,fifth,sixth]=fibs();
在解构的每一个值中都可以填写默认值
- 对象的结构赋值
结构不仅可以用于数组,还可以用于对象;
let {foo,bar}={foo:'aaa',bar:'bbb'};
foo//'aaa';
bar//'bbb';
上面的写法可以不按先后顺序;结构会按照属性以及属性名称进行匹配;
类如
let {bar,foo}={foo:'aaa',bar:'bbb'};
这样还是相同的结果;
bar//bbb;
foo//aaa;
如果中间写了不存在的属性;例如写了
let {x}={y:'bbb'};
其实这个时候x//undefined
-
字符串的解构赋值;
const [a,b,c,d,e]='hello';这个最终结果是 a //h;b //'e';c //'l';d //'l';e //'o';
; -
函数参数的解构赋值
function add([x,y]){
return x+y;
};
add([1,2]);
上面代码中函数add的参数
来着比较常用;
function move({x=0,y=0}={}){
return [x,y]
};
move({x:3,y:8});//[3,8];
move({x:3});//[3,0];
move({});//[0,0];
move();//[0,0];
- 说到重点就是用途;
解构用途很多;
(1)交换变量的值
let x=1;
let y=2;
[x,y]=[y,x];
上面代码交换变量下x,y;,这样的写法简洁易懂;
(2)从函数返回多个值
函数只能返回一个值;如果想要返回多个值,只能将他们放在数组或者对象里面返回,有了解构赋值,取出这些就非常方便了
// 返回一个数组
function example() {
return [1, 2, 3];
}
let [a, b, c] = example();
// 返回一个对象
function example() {
return {
foo: 1,
bar: 2
};
}
let { foo, bar } = example();
(3)函数参数的定义;
解构赋值可以很方便的将一组参数和变量名对应起来;
function f([x,y,z]){};
f([1,2,3]);
//参数是一组序的值;
function f({x,y,x}){}
f({z:3,y:2,x:1});
(4) 提取JSON的数据;
解构赋值对提取JSON对象中的数据,尤其有用;
let jsonData={
id:42,
status:'ok',
data:[867,5309]
};
let {id,status,data:number}=jsonData;
console.log(id,status,number);
//42,'OK',[867,5309];
上面代码可以快速的提取JSON;
(5)函数的默认参数;
jQuery.ajax = function (url, {
async = true,
beforeSend = function () {},
cache = true,
complete = function () {},
crossDomain = false,
global = true,
// ... more config
} = {}) {
// ... do stuff
};
指定了参数额默认值;就避了函数内部再写 `var foo=config.foo||'default foo';`这样的语句;
(6)遍历Map结构;
任何部署了Iterator接口的对象;都可以用for...of
循环遍历。Map结构原生支持Iterator接口;获取键名和键值;
const map=new Map();
map.set('first','hello');
map.set('second','world');
for(let [key,value] of map){
console.log(key+"is"+value)
};
//first is hello
//second is world;
如果只是想要获取键名;或者只是想获取键值可以写成如下
//获取键名
for(let [key] of map){
//。。。
}
//获取键值
for(let [,value] of map){
//...
}
(7) 输入模块的指定方法;
加载模块时;往往需要指定输入那些方法。解构赋值使得输入语句非常清晰;
const {SourceMapConsumer,SourceNode}=require('source-map');
网友评论