第二期,解构赋值如果能够熟练应用确实是个十分方便的功能,但是过分的依赖和嵌套只会让代码理解和维护起来十分困难,是个体现高逼格的表达式呢~

1,解构赋值的基础

//定义:es6运行按照一定模式,从数组或对象中提取值,并对变量进行赋值,如
var [a,b,c] = [1,2,3];
//一些其他方式
let [ , , a1] = [1,2,3];
//a1:3
let [a2,...b2] = [1,2,3,4];
//a2:1,b2:[2,3,4]
let [a3,b3,...c3] = [1];
//a3:1 b3:undefined c3:[]
let [a4,[b4],c4] = [1,[2,3],4];
//a4:1 b4:2 c4:4
function* fibs(){
var a=0;
var b=1;
while (true){
yield a;
[a,b] = [b,a+b];
}
}
var [a5,b5,c5,d5,e5,f5] = fibs();
//f5:5(这个是为什么暂时还不懂,以后在解读,官方解释:fibs是一个Generator函数,原生具有iterator接口,解构赋值时会依次从接口获取值)
//默认值与惰性求值
//在解构赋值时可以指定默认值
var [a6,b6 = 3] = [1];
//a6:1,b6:3 注意:只有在值严格等于(===)undefined时才会使用默认值,null是不行的
//如果默认值是一个表达式,则该表达式是惰性求值的,如
function f(){
console.log("lvyi")
}
let [a7=f()]=[1];
//不会执行f表达式,只在需要时执行内部指令
//ps:默认值是可以引用解构赋值中的其他变量的,但是该变量必须先有赋值
//对象也是可以解构赋值的,原理和数组差不多,但是需要指定模式和变量,并且对象和数组可以嵌套赋值,深入研究比较绕

2,其他形式的解构赋值

//对象解构赋值
var {p:x} = {p:1};
//p是模式,x才是需要赋值的变量,虽然模式可以省如({x}={1}),但复杂的解构中最好不要省如
var node={
loc : {
start:{
line:1
}
}
};
//loc和start都是模式,line才是变量 //字符串的解构赋值
const [a1,b2,c3,d4,e5] = 'hello';
let {length : len} = 'hello';
//len :5 因为字符串是可以转为数组的,而字符串又有length这个同名的属性,因此这两个赋值都是成功的 //数值和布尔值的解构
let {toString : s} =123;
let {toString : s1} = true;
//解构的规则是只要右边的值不是对象就先转为对象在赋值,因此这个两个都有toString这个属性,那么S就可以取到值
//但是undefined和null是没有的,因此如果右边是这两个会报错 //函数参数的解构赋值
function kk([x=0,y=0]){
return x+y
}
kk([1,2]);
//3,0为默认值
//看看下面的值是多少?
console.log([[1,2],[3,4]].map(([d,e]) => d+e));

3,解构赋值的应用

 //变换变量的值
[x,y]=[y,x];
//获取无序的参数或一组参数的值,(最主要方便的用途,以后再也不用遍历json去拿数据了)
var returnData={
id:42,
status : 'ok',
data: [521,214]
};
let {id,status,data:number} = returnData;
//简单明了
//为函数参数设定默认值,上一节有提到,挺好理解的,不用再函数内部写一堆var了
05-11 13:14