对象解构
104 Destructuring Objects(对象解构)笔记
一、对象解构基础用法
1.1 核心语法与规则
-
语法格式:使用
{}包裹需提取的属性名,等号右侧为目标对象,即const {属性名1, 属性名2,...} = 目标对象。 -
关键规则
:
- 变量名必须与对象属性名完全匹配(大小写敏感)。
- 属性顺序不影响解构结果(与数组解构不同,无需手动跳过元素)。
- 解构后会创建与属性名对应的新变量,直接使用即可。
1.2 例题
假设存在一个餐厅对象,包含名称、营业时间、菜品类别等属性,使用基础解构提取关键信息:
1 | // 目标对象 |
二、自定义解构变量名
2.1 核心语法与场景
- 语法格式:当需要变量名与属性名不同时,使用
属性名: 新变量名格式,即const {属性名: 新变量名,...} = 目标对象。 - 适用场景:处理第三方数据(如 API 返回结果)时,属性名可能不符合项目命名规范(如属性名过长、大小写不统一),需自定义简洁变量名。
2.2 例题
基于上述餐厅对象,将属性名自定义为更简洁的变量名:
1 | // 解构时自定义变量名:name→restaurantName,openingHours→hours,categories→tags |
三、解构时设置默认值
3.1 核心语法与作用
-
语法格式
:通过
1
属性名 = 默认值
设置默认值,支持结合自定义变量名(
1
属性名: 新变量名 = 默认值
),即:
- 基础默认值:
const {属性名 = 默认值,...} = 目标对象 - 结合自定义变量名:
const {属性名: 新变量名 = 默认值,...} = 目标对象
- 基础默认值:
-
核心作用:避免解构对象中不存在的属性时,变量值变为
undefined,尤其适用于数据结构不确定的场景(如 API 返回数据可能缺失部分字段)。
3.2 例题
假设餐厅对象可能缺失menu属性,starterMenu属性需自定义变量名并设置默认值:
1 | // 目标对象(缺失menu属性,存在starterMenu属性) |
四、解构时变异变量(修改已声明变量)
4.1 核心语法与注意事项
- 问题场景:若变量已提前声明(用
let定义),直接解构会因{}被 JS 识别为 “代码块” 而报错(代码块无法赋值)。 - 解决方案:将解构语句用
()包裹,强制 JS 将其识别为 “表达式”,语法为({属性名1, 属性名2,...} = 目标对象)。 - 注意事项:变异变量时,不能使用
const(const声明的变量不可修改),需用let声明初始变量。
4.2 例题
提前声明变量a和b,通过解构修改其值:
1 | // 提前声明已存在的变量(必须用let,不可用const) |
五、嵌套对象解构
5.1 核心语法与逻辑
-
语法逻辑
:嵌套对象需按照 “对象层级结构” 逐层解构,内层对象同样用
1
{}
包裹,格式为:
- 基础嵌套解构:
const {外层属性名: {内层属性名1, 内层属性名2,...}} = 目标对象 - 结合自定义变量名:
const {外层属性名: {内层属性名: 新变量名,...}} = 目标对象
- 基础嵌套解构:
-
关键逻辑:先定位到外层属性,再从外层属性对应的内层对象中提取目标属性。
5.2 例题
从餐厅对象的openingHours(外层属性,值为嵌套对象)中,提取周五的营业时间并自定义变量名:
1 | // 目标对象(openingHours为嵌套对象) |
六、对象解构在函数参数中的应用
6.1 核心语法与优势
-
语法格式
:函数定义时,直接对参数对象解构,支持设置默认值,格式为:
1
2
3function 函数名({属性名1 = 默认值, 属性名2 = 默认值,...}) {
// 函数体内直接使用解构后的变量
} -
核心优势
- 解决 “参数过多且顺序难记” 的问题(调用函数时无需关注参数顺序,只需传递对象)。
- 可直接为参数设置默认值,避免函数体内重复判断。
6.2 例题
创建 “订单交付” 函数,接收地址、菜品索引、时间等参数,通过解构简化参数处理:
1 | // 定义函数:参数对象解构,设置默认值(starterIndex=1,mainIndex=0,time='20:00') |
七、总结:对象解构核心要点
| 功能场景 | 核心语法示例 | 关键注意事项 |
|---|---|---|
| 基础提取属性 | const {a,b} = obj |
变量名与属性名必须完全匹配 |
| 自定义变量名 | const {a: newA, b: newB} = obj |
新变量名才是最终可用的变量 |
| 设置默认值 | const {a=1, b: newB=2} = obj |
仅当属性不存在时默认值生效 |
| 变异已声明变量 | ({a,b} = obj) |
必须用()包裹,初始变量用let声明 |
| 嵌套对象解构 | const {a: {b: newB}} = obj |
按层级结构逐层解构,内层用{}包裹 |
| 函数参数解构 | fn({a=1, b=2}) |
调用时传递对象,无需关注参数顺序 |
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自木鱼的鱼窝


