ES6-对象的解构赋值

一、区别一下数组的解构赋值

java 复制代码
- 对象的解构与数组有一个重要的不同。
	数组的元素是按次序排列的,变量的取值由它的位置决定;
	而对象的属性没有次序,变量必须与属性同名,才能取到正确的值

二、说明

java 复制代码
- 对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。
- 真正被赋值的是后者,而不是前者。
- 前者主要是用于匹配
  • 示例
js 复制代码
      let obj = {
        name: "wyt",
        age: 18,
      };
      let { name: myname } = obj;
      console.log("name:" + name);
      console.log("myname:" + myname);

//上面代码中,foo是匹配的模式,baz才是变量。真正被赋值的是变量baz,而不是模式foo
  • 效果
  • 解惑
java 复制代码
大家可能会有疑惑
- 问题:为什么值(字符串wyt)被赋值给了myname而非name
- 答案:此处name仅仅是匹配模式,myname才是变量
		即真正被赋值的是变量myname而非name

三、示例

1)简单的完整解构赋值

  • 示例
js 复制代码
      let obj = {
        name: "wyt",
        age: 18,
      };
      let { name, age } = obj;
      console.log("name:" + name);
      console.log("age:" + age);
  • 效果
  • 完整的代码
js 复制代码
      let obj = {
        name: "wyt",
        age: 18,
      };
      let { name: name, age: age } = obj;
      //前者name是匹配模式,后者name是真正被赋值的变量
      console.log("name:" + name);
      console.log("age:" + age);

2)简单的部分解构赋值(即按需解构)

  • 示例
js 复制代码
      let obj = {
        name: "wyt",
        age: 18,
      };
      let { name: name, age: age } = obj;
      console.log("age:" + age);
  • 效果

3)过度解构

复制代码
一般未匹配到的变量常常被赋值为undefined
  • 示例
js 复制代码
      let obj = {
        name: "wyt",
        age: 18,
      };
      //会发现obj中并没有school属性
      let { name, age, school } = obj;
      console.log("obj:name" + name + ",age=" + age + ",school=" + school);
  • 效果

4)复杂的完整解构

  • 示例
js 复制代码
      let stus_obj = {
        stu_1: {
          name: "wyt",
          age: 18,
        },
        stu_2: {
          name: "wyh",
          age: 15,
        },
      };
      let {
        stu_1: { name: name1, age: age1 },
        stu_2: { name: name2, age: age2 },
      } = stus_obj;
      console.log("stu_1:name=" + name1 + ",age=" + age2);
      console.log("stu_2:name=" + name2 + ",age=" + age2);
  • 效果
  • 疑惑
js 复制代码
- 大家可能会好奇两个问题
- 问题一:语句
 	  let {
        stu_1: { name: name1, age: age1 },
        stu_2: { name: name2, age: age2 },
      } = stus_obj;
      中的stu_1,stu_2是否被赋值
- 答案:这里的stu_1,stu_2未被赋值,这里仅仅用于匹配
- 问题二:为什么上面的语句不可以写成语句
			      let {
			        stu_1: { name, age },
			        stu_2: { name, age },
			      } = stus_obj;
- 答案:Cannot redeclare block-scoped variable 'name'和'age'
  • 解惑(如何获取stu_1和stu_2)
js 复制代码
      let stus_obj = {
        stu_1: {
          name: "wyt",
          age: 18,
        },
        stu_2: {
          name: "wyh",
          age: 15,
        },
      };
      let {
        stu_1,
        stu_2,
        stu_1: { name: name1, age: age1 },
        stu_2: { name: name2, age: age2 },
      } = stus_obj;
      console.log(stu_1);
      console.log("stu_1:name=" + name1 + ",age=" + age2);
      console.log(stu_2);
      console.log("stu_2:name=" + name2 + ",age=" + age2);

5)剩余运算符

  • 示例
js 复制代码
      let obj = {
        name: "wyt",
        age: 18,
        school: "七中",
      };
      //即将对象obj内的除了name以外的属性组件成一个新对象
      let { name, ...rest } = obj;
      console.log("name:" + name);
      console.log(rest);
  • 效果

6)赋予默认值

  • 示例
js 复制代码
      let obj = {
        name: "wyt",
        age: 18,
      };
      //此时的school被赋予了默认值七中,当school未匹配到时或者值为undefined时值为七中
      let { name, age, school = "七中" } = obj;
      console.log("name:" + name);
      console.log("age:" + age);
      console.log("school:" + school);
  • 效果

四、应用

1)常用于解构对象中的方法

js 复制代码
// 例一
let { log, sin, cos } = Math;
// 例二
const { log } = console;
log('hello') // hello

//例一将Math对象的对数、正弦、余弦三个方法,赋值到对应的变量上,使用起来就会方便很多。
//例二将console.log赋值到log变量。

2)常用于解构JSON对象里面所需的属性

js 复制代码
      let jsonData = {
        id: 42,
        status: "OK",
        data: [867, 5309],
      };
      //此时仅仅需要id和data属性的值
      let { id, data } = jsonData;
      console.log("id:" + id);
      console.log("data:");
      console.log(data);
  • 效果
相关推荐
孟陬1 小时前
Foobar 技术周刊#159:当看不懂代码时,如何高效排障调试。脏页陷阱:一条只读查询,写入数 TB 数据。推测解码:大模型加速利器
前端·人工智能·后端
Zhao-Jichao1 小时前
AI Prompting for Everyone 课程笔记 - P17 图像生成 Imaging Generation
前端
Highcharts.js2 小时前
智能数据分析组件Orbit 正式发布与快速上手体验教程
前端·人工智能·信息可视化·数据分析系统·highcharts·orbit·智能可视化
Dream-Y.ocean2 小时前
鸿蒙PC平台星图遥感适配实战:基于 Electron 壳方案的纯 JavaScript 遥感图像处理引擎开发
javascript·electron·harmonyos
螺丝钉tina2 小时前
[Playwright ][16]Playwright + TypeScript API 自动化测试实战:API测试
前端·javascript·typescript
小天源3 小时前
智叟云集系统 · 架构与职责分层
服务器·前端·数据库
Highcharts.js5 小时前
React 中原生支持使用 JSX 组件配置自定义表格 Highcharts Grid
前端·javascript·react.js·前端框架·jsx·highcharts·自定义表格
Java后端的Ai之路5 小时前
【AIAgent开发】-Agent工具封装成CLI(纯干货!!!)
java·javascript·人工智能·agent·cli
薛定谔的猫-菜鸟程序员5 小时前
Electron开发超详细教程(从入门到放弃)
前端·javascript·electron
最强小杰5 小时前
DeepSeek V4 Flash + Codex CLI 接入教程:原生 Responses API 适配,从配置到跑通收藏这篇就够了(2026)
java·前端·python·ai