重构表达式其本质上是“商业参数值”,如果等号两端的商业模式完全相同,右边的表达式就会被突显相关联的值。
重构准则:如果等号右边的值许多第一类,就先将其转成第一类。
一、字符串的重构表达式
字符串重构表达式,检索很关键,即次序很关键。
基本原理:等号右边计算机程序要有IteratorUSB,比如说字符串,Set。【update20170605】
1、重构[1,2,3]
//把1,2,3依次表达式给a,b,c var [a,b,c]=[1,2,3]; console.log(a+ | +b+ | +c);//1 | 2 | 32、更繁杂,更强悍的表达式,重构[1,[2,3]]
//把1,2,3依次表达式给a,b,c var [a,[b,c]]=[1,[2,3]]; console.log(a+ | +b+ | +c);//1 | 2 | 33、跳着表达式
//把1表达式给a,3表达式给c var [a,,c]=[1,2,3]; console.log(a+ | +c); //1 | 34、第一行
var [a,…b]=[1,2,3]; console.log(a+ | +b);//1 | 2,3 console.log(b);//[2, 3]ES6中,提供更多了一类将右侧累赘的值以字符串的方式表达式给右侧表达式的句法—”rest商业模式”。
因此有第一行时表达式很大是字符串类别的。
特别注意:【update20170605】
z的值是空字符串。
let [x,y,…z]=[a]; console.log(“x=”,x); //x= a console.log(“y=”,y); //y= undefined console.log(“z=”,z); //z= []5、指定默认值
//给c和d设置默认值为default var [a,b,c=default,d=default]=[1,2,3]; console.log(a+ | +b+ | +c+ | +d);//1 | 2 | 3 | default6、重构时未表达式的表达式值为undefined
//给c和d设置默认值为default var [a,b,c]=[1,2]; console.log(a+ | +b+ | +c);//1 | 2 | undefined优点:代码简单,清晰
7、ES6内部使用严格等于(===)判断一个位置是否有值
因此,如果一个字符串成员不严格等于undefined,默认值是不会生效的。
//字符串成员不严格等于undefined,默认值不会生效 var [x=1,y=2,z=3]=[undefined,”undefined”,null]; console.log(“x: “+x);//x: 1 console.log(“y: “+y);//y: undefined console.log(“x: “+z);//x: null8、默认值是表达式,表达式惰性求值
只有在用到的时候才会求值。
function f(){ console.log(“aaa”); } let[x=f()]=[1];//x能取到值,f根本不会执行相当于
let x; if([1][0]===undefined){ f(); }else{ x=[1][0]; } console.log(x);二、第一类的重构表达式
第一类重构表达式,次序不再关键,按名称重构
1、把a和b提取出来变成表达式
let obj={ a:1, b:2 } let {a,b}=obj; console.log(a+” | “+b);//1 | 22、重命名,把obj.a重命名为A
let obj={ a:1, b:2 } let {a:A,b}=obj; console.log(A+” | “+b);//1 | 2 console.log(a);//Uncaught ReferenceError: a is not defined3、let声明已经定义的表达式会报错
let obj={ a:1, b:2 } let a;//a已经定义了,后面再定义就会报错 let {a,b}=obj;//Uncaught SyntaxError: Identifier a has already been declared console.log(a+” | “+b);4、如果给已经定义的表达式,重新重构表达式?
如果只是如下表达式:会报错,js解析器遇到{}会当成代码块,因此重构表达式时{不能出现在一行的最前面。
{a,b}=obj;//Uncaught SyntaxError: Unexpected token =用小括号括起来
let obj={ a:1, b:2 } let a=0;//a已经定义 console.log(a); ({a,b}=obj);//用小括号括起来告诉js解析器这是条语句 console.log(a+” | “+b);//1 | 25、更繁杂的情况
let obj={ arr:[ lxy, { a:1 } ] } //繁杂重构 let {arr:[name,{a}]}=obj; console.log(name+” | “+a);//lxy | 16、第一类重构默认值
let {a=1,b=2}={a:10}; console.log(a+” | “+b);//10 | 27、a重命名之后指定默认值
let {a:A=1,b=2}={a:10}; console.log(A+” | “+b);//10 | 28、重构函数,即重构第一类的方法
比如说Math第一类里面有方法
let {floor,pow}=Math;//把Math里的方法提取出来变成一个表达式 let a=1.1; console.log(floor(a));//1 console.log(pow(2,3));//8三、其他
【想不到】
var {length}=lxy; console.log(length);//32、把字符串重构成字符串
字符串被转换成了一个类似字符串的第一类。
var [a,b,c]=lxy; console.log(a+”|”+b+”|”+c);//l|x|y3、对函数的传参进行重构
//字符串方式 var arr=[1,2]; function fun([a,b]){ console.log(“a:”+a); console.log(“b:”+b); } fun(arr); //a:1 //b:2 //重构第一类 var obj={a:1,b:2}; function fun({a,b}){ console.log(“a:”+a); console.log(“b:”+b); } fun(obj); //a:1 //b:2四、应用
1、交换表达式的值
[x,y]=[y,x];简洁易懂 let x= 1,y=2; [x,y]=[y,x]; console.log(“x: “+x);//x: 2 console.log(“y: “+y);//y: 12、从函数返回多个值
function example(){ return [1,2,3]; } var [a,b,c]=example();3、提取JSON数据
重构表达式对提取JSON数据尤其有用
//假设res为一个请求返回的结果 let res={ status:200, id:12, data:[{name:Bob},{name:Shuang Dan}] } //es6一行搞定 let {status,id,data}=res; //es5 var status=res.status; var id=res.id; var data=res.data;4、简化默认值
避免了在函数体内些 a=a||10;这样的语句。
var obj={b:2}; function fun({a=10,b}){ //a=a||10; //es5默认值写法 console.log(“a:”+a); console.log(“b:”+b); } fun(obj); //a:10 //b:2