盘点ES6解构大法-更便捷的数据访问

1,522 阅读5分钟

what is “解构”?

ES6提出的“解构”是什么?

在js中,万物均是对象,字符串、数组、对象、函数都是对象,所谓“解构”,也就是将上述数据结构进行解析的过程,使提取其中的数据变得更加容易、方便、快捷。

首先,我们来看一个例子,在以前的JS版本中,我们要从对象或数组中获取里面数据,需要存入本地变量,书写许多类似代码,例如:

 let obj = {
     name:"掘金",
     webSite:"www.juejin.com"
 }
 ​
 // 从obj对象中获取数据
 ​
 let name = obj.name, webSite = obj.webSite

上述代码看起来看简单,但我们想象一下,如果需要大量变量需要处理,必须要逐个赋值,那工作量就大了很多,且枯燥!

对象解构

ES6提供了新的对象解构语法,例如上述例子用解构语法表示为:

 let obj = {
     name:"掘金",
     webSite:"www.juejin.com"
 }
 ​
 // obj对象解构
 let { name, webSite} = obj
 ​
 console.log(name)  // => "掘金"
 console.log(webSite)  // => "www.juejin.com"

看起来是不是精简了代码?

name与 webSite不仅声明了同名本地变量,也读取了obj这个对象的相应属性值,上面示例用于了变量声明。

对象解构也适用于变量赋值时,例如:

 let obj = {
     name: "掘金",
     webSite: "www.juejin.com"
 }
 ​
 // obj对象解构
 ({ name,webSite } = obj)
 ​
 console.log(name) // => "掘金"
 console.log(webSite) // => "www.juejin.com"

注意,解构赋值时,需要用圆括号()来包括解构解构赋值语句,否则暴露的花括号会被识别成代码块语句出错,圆括号()括起来的内容解释为表达式,从而完成赋值。

如果使用解构赋值时,命名的本地变量在对象中找不到同名的属性,那么该变量值为undefined,下述代码定义了一个不能匹配obj属性的sex,所以它的值为undefined

 let obj = {
     name: "掘金",
     webSite: "www.juejin.com"
 }
 ​
 // obj对象解构
 let {
     name,
     webSite,
     sex
 } = obj
 ​
 console.log(name) // => "掘金"
 console.log(webSite) // => "www.juejin.com"
 console.log(sex) // => undefined

以上,均使用的对象属性名作为变量名,那么如果不打算使用同名变量的话,我们可以使用下面方法将变量名重命名:

 let obj = {
     name: "掘金",
     webSite: "www.juejin.com"
 }
 ​
 // obj对象解构
 let {
     name: webName,
     webSite: webPage
 } = obj
 ​
 console.log(webName) // => "掘金"
 console.log(webPage) // => "www.juejin.com"

对象如果有嵌套对象或数组,可采用下面方式,例如:

 let obj = {
     name: "掘金",
     webSite: "www.juejin.com",
     category: [
         "沸点", "课程", "直播", "活动", "商城", "APP", "插件"
     ],
     webInfo: {
         address: "北京",
         tel: "010-88887777"
     }
 }
 ​
 // obj对象解构
 let {
     webInfo,
     category
 } = obj
 ​
 console.log(webInfo.address) // => "北京"
 console.log(webInfo.tel) // => "010-88887777"
 for (var i = 0; i < category.length; i++) {
     console.log(category[i]);
 }

数组解构

数组解构语法类似对象解构,以掘金网站栏目分类为例:

 let category = ["沸点", "课程", "直播", "活动", "商城", "APP", "插件"];
 // 数组category的解构
 let [favoriteCat1, favoriteCat2, favoriteCat3] = category
 console.log(favoriteCat1, favoriteCat2, favoriteCat3); // => "沸点 课程 直播"

同对象解构同样可以在赋值表达式中使用数组解构:

 let category = ["沸点", "课程", "直播", "活动", "商城", "APP", "插件"];
 // 数组category的解构
 [favoriteCat1, favoriteCat2, favoriteCat3] = category
 console.log(favoriteCat1, favoriteCat2, favoriteCat3); // => "沸点 课程 直播"

需要注意的时,数组解构不需要外层的圆括号()。

数组解构,可以轻松的交换两个变量值:

 let webName = "掘金",
     newWebName = "新掘金";
 [webName, newWebName] = [newWebName, webName]
 console.log(webName); // => "新掘金"
 console.log(newWebName); // => "掘金"

与对象解构一样,当数组下标成员不存在时,其值也会定义成undefined

 let category = ["沸点", "课程"];
 // 数组category的解构
 [favoriteCat1, favoriteCat2, favoriteCat3] = category
 console.log(favoriteCat3); // => undefined

在解构语法中,允许给添加默认值,当数组下标成员不存在或值为undefined时,该默认值就赋值给变量。

 let category = ["沸点", "课程"];
 // 数组category的解构
 [favoriteCat1, favoriteCat2, favoriteCat3 = "活动"] = category
 console.log(favoriteCat3); // => "活动"

同对象解构赋值,嵌套数组的解构赋值也采取类似的方式,下例中favoriteCat2被解析成了["商城", "APP"]这个数组。

 let category = ["沸点", ["商城", "APP"], "课程"];
 // 数组category的解构
 [favoriteCat1, favoriteCat2] = category
 console.log(favoriteCat2); // => "(2) ["商城", "APP"]"

ES6中新增了...的剩余项扩展运算符,在数组里可以利用它来实现将数组的剩余成员赋值给变量,请看以下范例:

 let category = ["沸点", "课程", "直播", "活动", "商城", "APP", "插件"];
 // 数组category的解构
 [favoriteCat1, favoriteCat2, ...favoriteCat3] = category
 console.log(favoriteCat1); // => "沸点"
 console.log(favoriteCat2); // => "课程"
 console.log(favoriteCat3); // => (5) ["直播", "活动", "商城", "APP", "插件"]

favoriteCat1对应了category[0],favoriteCat2对应category[1],而其余的5个成员则通过...一并赋值给了favoriteCat3。

基于上例所示,...运算符亦可运用到复制数组上:

 let category = ["沸点", "课程", "直播", "活动", "商城", "APP", "插件"];
 [...newCategory] = category;
 console.log(newCategory); // => (7["沸点", "课程", "直播", "活动", "商城", "APP", "插件"]

函数参数解构

解构有一个很重要的作用就是函数参数解构:

 let category = ["沸点", "课程"];
 ​
 function myLikeCat([cat1, cat2]) {
     return `我喜欢掘金的两个栏目是${cat1}${cat2}。`
 }
 console.log(myLikeCat(category)); // => "我喜欢掘金的两个栏目是沸点和课程。"

函数参数解构时,也可以使用默认值:

 function myLikeCat({
     cat1 = "沸点",
     cat2 = "课程"
 } = {}) {
     return `我喜欢掘金的两个栏目是${cat1}${cat2}。`
 }
 console.log(myLikeCat({
     cat1: "商城"
 })); // => "我喜欢掘金的两个栏目是商城和课程。"

字符串的解构

字符串解构相对比较简单,下例把“我爱掘金”四个汉字对应赋值给love四个变量。

 const [l, o, v, e] = '我爱掘金';
 console.log(l); // => 我
 console.log(o); // => 爱
 console.log(v); // => 掘
 console.log(e); // => 金

总结

解构赋值主要帮助我们在获取对象或数组成员是更加方便、快捷,主要应用交换变量值、函数返回多个值、函数参数默认值、提取JSON数据、加载指定模块方法上。快快掌握这个语法吧,提高开发效率~~~

我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿