ES6解构实战

606 阅读3分钟

概述

ES6中的解构特性是一种针对数组或者对象进行模式匹配,方便我们从对象或者是数组中取值。
优点:代码书写简洁高效、可读性强。

对象解构

基础解构

let {name, age} = user 就是一个简单的数据解构过程,右边如果是对象,左边解构的语法也要用对象格式。
通过解构赋值的方式从等号右边user对象中解构出name和age属性,并赋值给了局部变量name和age。然后就可以直接使用name和age来进行其他操作。
注:解构出来的变量 一定要是 对象中能够查找到的属性名,如果解构出来的属性在对象中查找不到,值为undefined

// 传统方式获取对象属性值方式
let user = {
    name:'小明',
    age:18
}
console.log(user.name,user.age) // 小明 18


//ES6解构赋值
let user = {
    name:'小明',
    age:18
}
let {name, age} = user // 解构赋值
console.log(name, age)  // 小明 18

解构默认值

正常情况下当我们请求后台接口返回的数据包含name,age,sex三个属性时,由于数据缺省值为空的情况下,后端可能不会返回值为空的属性,这种场景下前端调用会出现undefined。当在这种特殊场景下前端设置解构默认值后,即可在拿不到对应属性值时显示默认值。

//ES6解构赋值
let user = {
    name:'小明',
    age:18
}
let {name, age, sex} = user // 解构属性不存在时,值为undefined
console.log(name, age,sex)  // 小明 18 undefined

// ES6解构赋值,并设置默认值
let user = {
    name:'小明',
    age:18
}
let {name='小明', age=18, sex='男'} = user // 解构赋值设置默认值
console.log(name, age,sex)  // 小明 18 男

数组解构

基础解构

使用var/let/const声明的变量用中括号包裹,变量的值对应等号后边数组对象中的索引位置上的元素值。
如果只想要其中某个索引位置的元素值,我们可以在之前的索引位置用逗号隔开留空即可。

// 当我们想获取值为'鱼'的时候
let pet = ['猫','狗','鱼']

//传统方式
console.log(pet[2])

//ES6解构赋值
let [,,thirdPet] = pet
console.log(thirdPet)

解构默认值

参考对象解构默认值

//ES6解构赋值
let [cat,dog,fish,horse] = ['猫','狗','鱼']  
console.log(cat, dog,fish,horse)  // 猫 狗 鱼 undefined

// ES6解构赋值,并设置默认值
let [cat,dog,fish,horse='马'] = ['猫','狗','鱼']   // 解构赋值设置默认值
console.log(cat, dog,fish,horse)  // 猫 狗 鱼 马

嵌套数组解构

参考一维数组的方式,当多维数组解构时,按多维数组的结构来申明变量结构。

//ES6解构赋值
let pet = ['猫',['哈士奇','中华田园犬'],'鱼']  
let [cat,dog] = pet
let [,[firstDog]] = pet
console.log(dog)  //  ["哈士奇", "中华田园犬"]
console.log(firstDog) // 哈士奇

剩余元素解构

我们可以通过使用...展开运算符把数组的多个元素一起赋值给某个变量。
注意:展开运算符必须是用在解构申明的最后一个变量,后面如果再申明其他变量,会抛出语法错误。

//ES6解构赋值
let pet = ['猫',['哈士奇','中华田园犬'],'鱼']  
let [firstPet,...residuePet] = pet
console.log(firstPet)  //  猫
console.log(residuePet) // [["哈士奇", "中华田园犬"],'鱼']

函数解构

不论是对象解构还是数组解构,比较常见的应用场景是函数解构传参。
例如:

let user = {
    name:'小明',
    age:18,
    sex:'男'
}
// 传统方式
function log(user){
	console.log(user.name, user.age)  // 小明 18
}
// ES6解构赋值
function log({name,age} = user){
    console.log(name, age)  // 小明 18
}
log(user)