Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >ES6解构嵌套对象

ES6解构嵌套对象

作者头像
IMWeb前端团队
发布于 2019-12-03 07:42:04
发布于 2019-12-03 07:42:04
1.2K00
代码可运行
举报
文章被收录于专栏:IMWeb前端团队IMWeb前端团队
运行总次数:0
代码可运行

本文作者:IMWeb zzbozheng 原文出处:IMWeb社区 未经同意,禁止转载

让我们先回忆一下ES6的对象解构,本文介绍各种ES6的对象解构用法,你用过哪一种?

最基本的解构

在对象中提取某个字段

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const user = {
  id: 123,
  name: 'hehe'
};
const {name} = user;
console.log(name); //prints: hehe

解构并使用别名

有时接口定义的字段往往带有下划线,但我们的前端更便好于驼峰式命名,那么可以使用别名(rename):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const user = {
  id: 123,
  nick_name: 'hehe'
};
const {nick_name: nickName} = user;
console.log(nickName); //prints: hehe

解构嵌套对象

有时我们会遇到嵌套对象,如果我们了解未足够多时,会写出这种解构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const user = {
  id: 123,
  name: 'hehe',
  education: {
    degree: 'Masters'
  }
};

// 假设我们要提取degree
const {education} = user;
const {degree} = education;

我们会写两行,一层层的剥开,明显繁琐,如果这个对象有三四层结构那简直无法入目。其实可以用解构一步到位的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const user = {
  id: 123,
  name: 'hehe',
  education: {
    degree: 'Masters'
  }
};
const {education: {degree}} = user;
console.log(degree); //prints: Masters

没错,就是比别名方法多了一个{ }

如果没有外层怎么办

假设要解构的数据是由接口返回的,由于某种原因会导致某个字段丢失。我们会往往遇到这种意外:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const user = {
  id: 123,
  name: 'hehe'
};
const {education: {degree}} = user;  // TypeError: Cannot match against 'undefined' or 'null'.

这时你是否会觉得还是我们原始的方法好使:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const education = user || {};
const degree = education.degree;

其实,神奇的解构可以让你定义一个缺省值,这样,我们不仅可以达到数据防御的目的,而且告别啰嗦的写法了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const user = {
  id: 123,
  name: 'hehe'
};

const {
    education: {
        degree
    } = {}
} = user;
console.log(degree); //prints: undefined

这明显是一股清流啊。

更深层次的对象怎么办?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const user = {
  id: 123,
  name: 'hehe'
};

const {
    education: {
        school: {
            name
        }
    } = {}
} = user;  // TypeError: Cannot match against 'undefined' or 'null'.

这里外层对education设置缺省值,但里面的school不存在,依然会报错。

我们第一种办法就是继续对school设置缺省值为{}:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const user = {
  id: 123,
  name: 'hehe'
};
const {
    education: {
        school: {
            name
        } = {}
    } = {}
} = user;
console.log(name); //prints: undefined

另一种办法就是直接给education缺省值设置为{school: {}}:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const user = {
  id: 123,
  name: 'hehe'
};
const {
    education: {
        school: {
            name
        }
    } = {school: {}}
} = user;
console.log(name); //prints: undefined

这两种方法看似都可以,但如果要给学校名称school.name一个缺省值呢?如果是第一种方法,会写成这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const user = {
  id: 123,
  name: 'hehe'
};
const {
    education: {
        school: {
            name = 'NB'
        } = {}
    } = {}
} = user;
console.log(name); //prints: NB

你数数看,这有多少个“=”号吗?啰嗦得不行,再看第二种方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const user = {
  id: 123,
  name: 'hehe'
};
const {
    education: {
        school: {
            name
        }
    } = {
        school: {
            name: 'NB'
        }
    }
} = user;
console.log(name); //prints: NB

这样整体给education设置一个缺省值,可读性更强,这又是一股清流。

但是遇到以下这种情况,那第二种情况就有可能报错了(感谢腾爷提供本case):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const user2 = {
  id: 123,
  name: 'hehe',
  education: {}
};
const {
    education: {
        school: {
            name
        }
    } = {
        school: {
            name: 'NB'
        }
    }
} = user2;
console.log(name); // Uncaught TypeError: Cannot match against 'undefined' or 'null'.

这个例子中education 给了一个空对象,因为是非空,这样会导致解构赋默认值失败,除非和接口约定不返回空对象,否则第二种方法也要慎用。

在代码中灵活使用解构不仅可以使代码简洁可读,而且逼格大大提升。

参考资料

[https://medium.com/[@pyrolistical](/user/pyrolistical)/destructuring-nested-objects-9dabdd01a3b8](https://medium.com/[@pyrolistical](/user/pyrolistical%29/destructuring-nested-objects-9dabdd01a3b8)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-12-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ES6+好用的小技巧,让你的代码更干净,短巧,易读
模板字符串 let name = 'siri', age = 18, job = 'front-end engineer' /let oldStr = 'Hi, ' + name + ', I\'m ' + age + ' and work as a ' + job + '.'; let newStr = `Hi, ${ name }, I'm ${ age } and work as a ${ job }.`; 扩展操作符 … 操作符,有两个主要用处: 复制一个新的数组或对象 把多个参数赋值给一个
前端知否
2020/03/23
4220
ES6中的解构赋值
ES6解构:es6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称之为解构。
刘亦枫
2020/03/19
8630
ES6新增语法 对象解构
ECMAScript6新增了对象解构语法,可以在一条语句中使用嵌套数据实现一个或者多个赋值操作, 简单的说,对象解构就是使用了与对象匹配的解构来实现对象属性赋值
心安事随
2024/07/29
1090
ES6新增语法 对象解构
ES6面试点-对象的解构赋值
数组本质是特殊的对象,下面代码对数组进行对象解构。数组arr的0键对应的值是1,[arr.length - 1]就是2键,对应的值是3。方括号这种写法,属于“属性名表达式”
用户10106350
2022/10/28
5470
ES6学习之函数传参
该文摘要总结
IMWeb前端团队
2018/01/08
2.1K0
ES6 解构赋值详解
ES6是JavaScript语言的一次重大更新,引入了许多新特性和语法改进,其中解构赋值是一个非常实用和灵活的语法特性。它可以让我们从数组或对象中提取值,并赋给对应的变量,让代码变得更加简洁和易读。本文将深入探讨ES6解构赋值的语法、用法及其在实际开发中的应用。
修己xj
2024/07/04
1350
ES6 解构赋值详解
ES6语法学习(变量的解构赋值)
另一种情况是不完全解构:就是等号左边的模式只匹配一部分等号右边的数组,这样解构依然可以成功
帅的一麻皮
2020/06/22
5410
ES6解构赋值详解;全面掌握:JavaScript解构赋值的终极指南
解构赋值(Destructuring Assignment)是 ES6(ECMAScript 2015) 引入的一种强大且灵活的语法,允许将数组或对象中的数据提取到变量中。它可以极大地简化从复杂数据结构中获取数据的过程。在以下内容中,我将详细解释解构赋值的语法及其在实践中的应用。
watermelo37
2025/01/22
920
ES6解构赋值详解;全面掌握:JavaScript解构赋值的终极指南
ES6——解构赋值(Destructuring)
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。在ES6 之前为变量赋值,只能直接指定值。
羊羽shine
2019/07/16
8800
ES6笔记(3)-- 解构赋值
其实,解构赋值内部的实现方式使用到了ES6的Iterator迭代器,通过层层遍历,保证了相应值的获取
书童小二
2018/09/03
7620
ES6 解构赋值详解
由于 ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,如果一个数组成员不严格等于 undefined,默认值是不会生效的。
Leophen
2019/08/23
8190
ES6的let和const
由let和const声明的变量都会有自己的TDZ。当进入这个变量的作用域的时候,这个变量是不能被访问的,直到这个变量被初始化。我们来看下面一段代码
IMWeb前端团队
2019/12/05
2810
ES6--变量的声明及解构赋值
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
奋飛
2019/08/15
9390
ES6变量的解构赋值
复杂的解构赋值:可以将我们讲解的数组、字符串、对象综合起来,进行解构赋值,必须遵循解构赋值的三个特征;
张哥编程
2024/12/07
810
ES6相关概念与ES6新增语法
ES 的全称是 ECMAScript , 它是由 ECMA 国际标准化组织,制定的一项脚本语言的标准化规范。
梨涡浅笑
2020/10/28
4440
ES6相关概念与ES6新增语法
JavaScript——ES6新增语法特性
ES的全称是ECMAScript,它是由ECMA国际标准化组织制定的一项脚本语言的标准化规范
岳泽以
2022/10/26
4260
JavaScript——ES6新增语法特性
小邵教你玩转ES6(一)-let,const和解构赋值
这篇文章主要让你学会工作当中常用的es6技巧,以及扩展如实现数据双向绑定,class用es5如何实现、如何给伪数组添加迭代器等等。
前端迷
2019/12/03
6420
带你入门 JavaScript ES6 (一)
ES6: 是 ECMA国际组织于 2015 年 6 月 17 日发布的 ECMAScript 第六版,正式名为 ECMAScript 2015,通常被成为 ES6 或 ECMAScript 6。
柳公子
2018/09/17
5650
「JS高级」ES6
请注意,本文编写于 2056 天前,最后修改于 169 天前,其中某些信息可能已经过时。
曼亚灿
2023/05/17
1.7K0
「JS高级」ES6
变量的解构赋值
上面代码中,函数move的参数是一个对象,通过对这个对象进行解构,得到变量x和y的值。如果解构失败,x和y等于默认值。
达达前端
2019/08/19
4.2K0
相关推荐
ES6+好用的小技巧,让你的代码更干净,短巧,易读
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验