在Javascript的6版解析解构的任务

什么是解构任务

解构任务允许您使用类似数组或对象文字的语法将数组和对象的属性值赋给一系列变量,这种语法比传统的属性访问更简洁明了。

在没有解构赋值的情况下,数组的前三项被访问:




VaR首先somearray { 0 };
无功二= somearray { 1 };
功第三= somearray { 2 };

VaR首先somearray { 0 };
无功二= somearray { 1 };
功第三= somearray { 2 };



在解构任务之后,相应的代码变得更加简洁易读:




var {第一,第二,第三} = somearray;

var {第一,第二,第三} = somearray;



SpiderMonkey(Firefox的Javascript引擎)支持大部分的解构分配的特点,但它是不完整的。

数组和一个解构对象分配

我们已经看到了上面的数组解构赋值的一个例子。语法的一般形式是:




{ variable1,variable2,…,variablen } =阵列;

{ variable1,variable2,…,variablen } =阵列;



这将指定数组中variable1到variablen对应项。如果您需要在同一时间声明变量,可以在表达式之前添加VaR、LET或const关键字。




var { variable1,variable2,…,variablen } =阵列;
让{ variable1,variable2,…,variablen } =阵列;
const { variable1,variable2,…,variablen } =阵列;

var { variable1,variable2,…,variablen } =阵列;
让{ variable1,variable2,…,variablen } =阵列;
const { variable1,variable2,…,variablen } =阵列;





事实上,还可以嵌套任何深度:




var { { { } foo,酒吧,巴兹} } = { 1,3 } { 2 } {,};
console.log(Foo);
1
console.log(酒吧);
2
console.log(Baz);
3

var { { { } foo,酒吧,巴兹} } = { 1,3 } { 2 } {,};
console.log(Foo);
1
console.log(酒吧);
2
console.log(Baz);
3



此外,还可以跳过数组中的某些项。




{第三,}
(第三)console.log;
/ / 巴兹


{第三,}
(第三)console.log;
/ / 巴兹




还可以使用REST表达式来捕获数组中的剩余项:




var,…尾} { 1, 2, 3,4 };
console.log(尾);
{ { 2, 3, 4 }

var,…尾} { 1, 2, 3,4 };
console.log(尾);
{ { 2, 3, 4 }



如果数组超过边界或访问数组中不存在的项,则使用数组索引访问相同的值:未定义的。




console.log({ } { 0 });
未定义

丢失的} { };
console.log(失踪);
未定义

console.log({ } { 0 });
未定义

丢失的} { };
console.log(失踪);
未定义




注意数组赋值也适用于ergodicable对象解构:




功能*小谎(){
var a=0;
var b=1;
当(真){
产量;
{ A,B,},A,B,};
}
}

var {第一,二,第三,第四,第五,第六} =谎言();
(第六)console.log;
5

功能*小谎(){
var a=0;
var b=1;
当(真){
产量;
{ A,B,},A,B,};
}
}

var {第一,二,第三,第四,第五,第六} =谎言();
(第六)console.log;
5




对象的解构赋值

对象的解构赋值允许您将变量绑定到对象的不同属性值。指定绑定属性名,然后绑定到变量:




VaR robota = {姓名:弯曲};
无功robotb = {姓名:柔性};

var {姓名:NAMEA } =机器人;
var { } = robotb名称:全国船用发动机建造商协会;

console.log(NAMEA);

console.log(全国船用发动机建造商协会);


VaR robota = {姓名:弯曲};
无功robotb = {姓名:柔性};

var {姓名:NAMEA } =机器人;
var { } = robotb名称:全国船用发动机建造商协会;

console.log(NAMEA);

console.log(全国船用发动机建造商协会);





当绑定属性名与接收到的属性值的变量名相同时,有一个语法糖:




var { } = { foo foo,bar:也许你
console.log(Foo);
/ / 都
console.log(酒吧);
/ / 乱数假文

var { } = { foo foo,bar:也许你
console.log(Foo);
/ / 都
console.log(酒吧);
/ / 乱数假文



像数组一样,它也可以嵌套:




无功complicatedobj = { {
ArrayProp:{
他们
{二:B}
}
};

{ } { var arrayprop:第一{二= complicatedobj,} };

Console.log(一);
/ / 扎普
console.log(二);
/ / 无所遁形

无功complicatedobj = { {
ArrayProp:{
他们
{二:B}
}
};

{ } { var arrayprop:第一{二= complicatedobj,} };

Console.log(一);
/ / 扎普
console.log(二);
/ / 无所遁形




当对一个不存在的属性,你会得到不确定的:




丢失的} { };
console.log(失踪);
未定义

丢失的} { };
console.log(失踪);
未定义



对对象的解构赋值有一个潜在的陷阱,赋值时没有声明变量(没有VaR,让,或const关键字)。




{ } = {爆破爆破:10 };
语法错误

{ } = {爆破爆破:10 };
语法错误



这是因为Javascript语法告诉引擎,以{从{开始的任何语句都是语句块(例如,{ }是合法语句块)。解决方法是把整个句子用一对括号括起来。




({安全} { });
无错误

({安全} { });
无错误



其他情况

当您试图解构null或未定义时,您将得到类型错误:


var { } = null爆破;
空没有属性 / /列表:

var { } = null爆破;
空没有属性 / /列表:




但是,您可以解构其他基本类型(布尔、字符串和数字)并获得未定义:




var {跆拳道} =楠;
console.log(WTF);
未定义


var {跆拳道} =楠;
console.log(WTF);
未定义




结果可能会给你一个惊喜,但事实上,原因很简单,当对象被解构和分配,即解构的对象将转换为对象。除了空的和不确定的其他类型可以强制转换成对象。当一个数组的结构分配,即解构的对象有一个ergodicer。

默认值

可以为不存在的属性指定默认值:




var;
console.log(失踪);
/真

消息:错误};
console.log(MSG);
出了什么问题

3;
console.log(X);
3

var;
console.log(失踪);
/真

消息:错误};
console.log(MSG);
出了什么问题

3;
console.log(X);
3




实际应用

功能参数

作为开发人员,我们经常使用多属性对象作为函数参数来实现更灵活的API,而不是让API用户记住某些特定的序列参数,我们可以使用对象的解构赋值避免在每次使用参数时访问属性:




功能removebreakpoint({ URL、线、柱}){

}

功能removebreakpoint({ URL、线、柱}){

}



配置对象

完善上面的例子,我们可以为对象的默认值属性被解构,这是非常实用的那些配置参数的对象,因为很多配置项目有一个合理的默认值。例如,对jQuery的Ajax方法的第二个参数是一个配置对象,我们可以用这种方式实施:




jquery.ajax =功能(URL,{
async =真,
beforesend =空,
缓存=真,
完整的=空,
跨域= false,
全局=真,
更多配置…
{ })
做某事…
};

jquery.ajax =功能(URL,{
async =真,
beforesend =空,
缓存=真,
完整的=空,
跨域= false,
全局=真,
更多配置…
{ })
做某事…
};



这避免了类似这样的代码:复制VaR foo = config.foo thedefaultfoo | |;。

与迭代器一起使用

当遍历映射对象时,我们可以使用解构赋值遍历{键、值}:




新地图();
map.set(窗口,全球);
map.set(文件,文件);

对于(映射的键、值}){
console.log(键+是+价值);
}
窗口}是全局 对象
这是文件 / }或{对象


新地图();
map.set(窗口,全球);
map.set(文件,文件);

对于(映射的键、值}){
console.log(键+是+价值);
}
窗口}是全局 对象
这是文件 / }或{对象




仅遍历键:




对于(映射的{键}){

}


对于(映射的{键}){

}

仅遍历值:
对于(映射的{值}){

}


对于(映射的{值}){

}




返回多个值

返回一个数组,由解构赋值提取到返回值:




功能returnmultiplevalues(){
返回{ 1, 2 };
}
var { } = returnmultiplevalues foo,bar();


功能returnmultiplevalues(){
返回{ 1, 2 };
}
var { } = returnmultiplevalues foo,bar();




或者,返回具有键值对的对象:




功能returnmultiplevalues(){
返回{
美孚:1,
2条:
};
}
var { } = returnmultiplevalues foo,bar();


功能returnmultiplevalues(){
返回{
美孚:1,
Bar: 2
};
}
var { } = returnmultiplevalues foo,bar();




这两种方法都比使用中间变量更好。




功能returnmultiplevalues(){
返回{
美孚:1,
2条:
};
}
VaR的温度= returnmultiplevalues();
变量foo = temp.foo;
VaR吧= temp.bar;

功能returnmultiplevalues(){
返回{
美孚:1,
2条:
};
}
VaR的温度= returnmultiplevalues();
变量foo = temp.foo;
VaR吧= temp.bar;



使用延续类型:




功能returnmultiplevalues(K){
K(1, 2);
}
returnmultiplevalues((foo,bar)= >…);


功能returnmultiplevalues(K){
K(1, 2);
}
returnmultiplevalues((foo,bar)= >…);




导入指定的部分CommonJS模块

你还没有使用ES6模块呢,这至少CommonJS。当导入CommonJS模块,模块提供的方法可能比你实际使用。与解构的任务,你可以指定你需要使用模块部分:




{ SourceNode } = const sourcemapconsumer,要求(源图);

{ SourceNode } = const sourcemapconsumer,要求(源图);



如果你使用ES6模块机制,你可以看到在进口报关语法相似。

结论

我们知道解构在很多场景中都是有用的,在Mozilla,我们有很多经验,Lars Hansen 10年前将解构任务引入歌剧。布兰登·艾奇还增加了支持Firefox后有轻微的延迟。它最初出现在Firefox 2中,因此,解构任务已经渗透到我们日常使用的js中,悄悄地使我们的代码变得更短而整洁。