[解构赋值-02] 对象的解构赋值

对象的结构赋值与数组的结构赋值相似,等号左右两边都为对象结构 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;

你可能感兴趣的:([解构赋值-02] 对象的解构赋值)