ES6 新增语法 对象解构

介绍

ECMAScript6新增了对象解构语法,可以在一条语句中使用嵌套数据实现一个或者多个赋值操作,
简单的说,对象解构就是使用了与对象匹配的解构来实现对象属性赋值

简单使用

下面是不使用对象解构写的代码

let person = {name:"张三",age:21}
let personName = person.name
let personAge = person.age
console.log(personName) // 张三
console.log(personAge) // 21

再用对象解构的语法来实现一下

let person = {name:"张三",age:21}
let {name:PersonName,age:PersonAge} = person
console.log(PersonName,PersonAge) // 张三,21

两者实现的功能一样,但明显对象解构的方式更加方便,简洁

1. 解构源对象不存在的属性,会打印成来undefined

let person = {name:"张三",age:21}
let {name:PersonName,job:PersonAge} = person
console.log(PersonName,PersonAge) // undefined

2. 在解构赋值的同时可以定义默认值,这就有效解决了前面的源对象未定义该 属性的问题

let person = {name:"张三",age:21}
let {name:PersonName,job="WebKaiFa"} = person
console.log(PersonName,job) // 张三 WebKaiFa

3. 解构并不要求变量必须在结构表达式中声明`,不过,如果给事先声明的 变量 赋值,则赋值表达式必须包含在一对括号当中

如果不加括号的的情况(报错)

let personName,personAge;
let person = {name:"张三",age:21};
{name:personName,age:personAge} = person;
console.log(personName,personAge);
//  Uncaught SyntaxError: Unexpected token 

加了括号(正常输出)

let personName,personAge;
let person = {name:"张三",age:21};
({name:personName,age:personAge} = person)
console.log(personName,personAge); // 张三 21

4. 嵌套解构

let person = {name:"张三",age:21,job:{
    name:"WebKaiFa"
}};
let personCopy = {};
// 解构源对象 赋值给personCopy空对象
({name:personCopy.name,age:personCopy.age,job:personCopy.job} = person)
console.log(personCopy);

1.png

因为一个对象的引用被赋值给personCopy空对象,所以修改源对象的属性值,personCopy的值也会对应的发生改变,

5.在外层属性没有定义的情况不能使用嵌套解构,无论源对象还有目标对象都是 一样的

显示undefined

let person = {name:"张三",age:21,job:{
    name:"WebKaiFa"
}};
let personCopy = {};
// 解构源对象 赋值给personCopy空对象
({address:personCopy.address} = person)
console.log(personCopy); // {address: undefined}

报错:因为address在源对象上找不到该属性

let person = {name:"张三",age:21,job:{
    name:"WebKaiFa"
}};
let personCopy = {};
// 解构源对象 赋值给personCopy空对象
({address:{
    p:personCopy.address
}} = person)
console.log(personCopy);
// 报错:Uncaught TypeError: Cannot read properties of undefined (reading 'p')

6. 参考上下文匹配

在函数参数列表中也可以进行解构赋值,对参数的解构赋值不会影响到arguments对象,但可以在函数签名中声明在函数体内使用局部变量

let person = {name:"张三",age:21}
function PrintPerson(foo,{name,age},bat){
    console.log(arguments);
    console.log(name,age) //  张三 21
}
PrintPerson('star',person,'end')
// Arguments(3) ['star', {…}, 'end', callee: (...), Symbol(Symbol.iterator): ƒ]

7. 总结一下

ES6对象解构语法的优点和好处有以下几点:

  • 可以方便地从对象中提取属性值,不需要使用点运算符或中括号。
  • 可以给变量赋予默认值,避免undefined或null的情况。
  • 可以使用别名,给变量取一个与对象属性名不同的名字。
  • 可以嵌套解构,从对象的深层属性中提取值。
  • 可以与函数参数结合,简化函数的定义和调用。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值