对象的结构赋值与数组的结构赋值相似,等号左右两边都为对象结构 const {a,b} = {a:1,b:2}
, 左边的{}中为需要赋值的变量,右边为需要解构的对象。
对象结构赋值的用法
const obj = {
saber: '阿尔托利亚',
archer: '卫宫'
};
const { saber, archer1 } = obj;
注意 : 与数组的结构赋值不同的地方在于,对象的结构赋值中,变量需要与要结构的对象属性名保持一致,否则得到的值为undefined,因为数组的结构是根据下标来排序的,而对象的属性是无序的,需要用属性名来匹配。
稍微复杂的解构条件
假设有一个游戏玩家的资料如下
const player = {
nickname: '感情的戏∫我没演技∆',
master: '东海龙王',
skill: [{
skillName: '龙吟',
mp: '100',
time: 6000
},{
skillName: '龙卷雨击',
mp: '400',
time: 3000
},{
skillName: '龙腾',
mp: '900',
time: 60000
}]
};
我们想取出对应的值
//取出名字
const { nickname } = player;
//取出门派
const { master } = player;
//只取出第一个技能 :我们可以先取出玩家技能,再进行数组的结构赋值
//const { skill } = player;
//const [ skill1 ] = skill;
//这样的方法有些多此一举,我们可以直接配合使用
const { skill :[skill1] } = player;
//这样第一个技能skill1可以直接取出,但与第一中方式不同的是,skill最后是不存在的变量。
//此时我们如果还想拿到第二个技能中的skillName,因为skill这个数组中的值是对象,我们可以再用对象的结构赋值
const { skill: [ skill1, { skillName } ] } = player;
//但是我们没有办法对第三个skillName用相同的方式
//const { skill: [ skill1, { skillName }, { skillName: } ] } = player; 因为我们不能重复声明相同的变量。
//对象的结构赋值提供了一种方式,只要在变量名中跟一个冒号,然后跟上一个新的变量名字就可以了。
const { skill: [ skill1, { skillName }, { skillName: sklName } ] } = player;
对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量
- { skillName}意思是,我们取skillName这个属性,并把值赋给skillName这个变量
- { skillName: sklName } 意思是,取这个对象中的skillName,然后把值赋给sklName这个变量。(即匹配的是skillName属性,但赋值给sklName变量)
结合扩展运算符
const obj = {
saber: '阿尔托利亚',
archer: '卫宫',
lancer: '瑟坦达'
};
//扩展运算符会把没有匹配到的所有内容生成一个对象,都赋值给oth
const { saber, ...oth } = obj;
可以用扩展运算符去合并两个对象。
const obj = {
saber: '阿尔托利亚',
... {
archer: '卫宫',
lancer: '瑟坦达'
},
};
//即把一个对象的内容放入另一个对象
const obj1 = {
archer: '卫宫',
lancer: '瑟坦达'
}
const obj = {
saber: '阿尔托利亚',
...obj1,
};
如何对已经申明了的变量进行对象的解构赋值
let age;
const obj = {
name: '小明',
age: 22
};
//因为age已经声明了,所以可以直接使用
({ age } = obj);
这里对使用{ age } = obj
括号,否则报错,原因是es6将{age}
理解为块级作用域,再将obj赋值给这个块级作用域,这在语法上肯定是行不通的
一般不建议这么做,解构赋值的时候还是不要事先声明变量。
默认值
let girlfriend = {
name: '小红',
age: undefined,
};
//当匹配不到,或者匹配到undefined,会用到默认值
let { name, age = 24, hobby = ['学习'] } = girlfriend;