ES6-对象的解构赋值

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

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

二、说明

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

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

三、示例

1)简单的完整解构赋值

  • 示例
      let obj = {
        name: "wyt",
        age: 18,
      };
      let { name, age } = obj;
      console.log("name:" + name);
      console.log("age:" + age);
  • 效果
    在这里插入图片描述
  • 完整的代码
      let obj = {
        name: "wyt",
        age: 18,
      };
      let { name: name, age: age } = obj;
      //前者name是匹配模式,后者name是真正被赋值的变量
      console.log("name:" + name);
      console.log("age:" + age);

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

  • 示例
      let obj = {
        name: "wyt",
        age: 18,
      };
      let { name: name, age: age } = obj;
      console.log("age:" + age);
  • 效果
    在这里插入图片描述

3)过度解构

一般未匹配到的变量常常被赋值为undefined
  • 示例
      let obj = {
        name: "wyt",
        age: 18,
      };
      //会发现obj中并没有school属性
      let { name, age, school } = obj;
      console.log("obj:name" + name + ",age=" + age + ",school=" + school);
  • 效果
    在这里插入图片描述

4)复杂的完整解构

  • 示例
      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);
  • 效果
    在这里插入图片描述
  • 疑惑
- 大家可能会好奇两个问题
- 问题一:语句
 	  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)
      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)剩余运算符

  • 示例
      let obj = {
        name: "wyt",
        age: 18,
        school: "七中",
      };
      //即将对象obj内的除了name以外的属性组件成一个新对象
      let { name, ...rest } = obj;
      console.log("name:" + name);
      console.log(rest);
  • 效果
    在这里插入图片描述

6)赋予默认值

  • 示例
      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)常用于解构对象中的方法

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

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

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

      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);
  • 效果
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/371599.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32学习笔记三——深度讲解GPIO及其应用

目录 STM32GPIO端口位基本结构图: 结构图I/O引脚: GPIO输入输出总结 1.GPIO引脚的四种输入方式及其特点: 1)上拉输入(GPIO_Mode_IPU) 2)下拉输入(GPIO_Mode_IPD) 3)模拟输入(GPIO_Mode_AIN) 4)浮空输入(GPIO_Mode_IN_FLOATING…

信创ARM架构QT应用开发环境搭建

信创ARM架构QT应用开发环境搭建 前言交叉工具链Ubuntu上安装 32 位 ARM 交叉工具链Ubuntu上安装 64 位 ARM 交叉工具链 交叉编译 QT 库下载 QT 源码交叉编译 QT 源码 Qt Creator交叉编译配置配置 Qt Creator Kits创建一个测试项目 前言 有没有碰到过这种情况?开发出…

幻兽帕鲁服务器怎么搭建?Palworld多人联机教程

玩转幻兽帕鲁服务器,阿里云推出新手0基础一键部署幻兽帕鲁服务器教程,傻瓜式一键部署,3分钟即可成功创建一台Palworld专属服务器,成本仅需26元,阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…

Awesome Chrome Form UI - 界面设计与实现

上苍不会让所有幸福集中到某个人身上,得到了爱情未必拥有金钱;拥有金钱未必得到快乐;得到快乐未必拥有健康;拥有健康未必一切都会如愿以偿。知足常乐的心态才是淬炼心智、净化心灵的最佳途径。一切快乐的享受都属于精神,这种快乐把忍受变为享受,是精神对于物质的胜利。这…

C语言实现memcpy、memmove库函数

目录 引言一、库函数介绍二、库函数详解三、源码实现1.memcpy源码实现2.memmove源码实现 四、测试1.memcpy函数2.memmove函数 五、源码1.memcpy源码2.memmove源码 六、参考文献 引言 关于memcpy和memmove这两个函数,不论是算法竞赛还是找工作面试笔试,对…

STM32单片机的基本原理与应用(六)

串口测试实验 基本原理 在串口实验中,是通过mini_USB线搭建终端与电脑端(也可称终端,为做区分称电脑端)的“桥梁”,电脑端的串口调试助手通过mini_USB线向终端发送信息,由CH340芯片将USB接口进行转换&…

DelayQueue的使用

具体思路: 在容器初始化的时候就创建出一个 延迟队列 然后项目启动后随即启动一个线程一直监听这个队列 手动调用接口往队列中添加任务 依赖 一个最简单的web的应用即可项目文件结构 第一步:在项目启动的时候就创建出一个延迟队列 Configuration publ…

数据结构 - 线段树

1. 预制值: 构建的数组为,nums:【2, 5, 1, 4, 3】区间和问题,假设求区间 [1,3] 的和 2. 建树 2.1 构建线段树数组 int[] segT new int[4*n](为什么数组大…

理解进程的一些知识准备

1. 认识冯诺依曼体系结构 计算机有很多的体系结构,但到如今,冯诺依曼体系结构变成了主流。 输入设备:话筒、键盘、摄像头、鼠标、磁盘、网卡… 输出设备:声卡、显示器、打印机、显卡、网卡、磁盘… 有的设备既能作为输入设备又能…

机器学习的整个流程

机器学习的整个流程定义了数据科学团队执行以创建和交付机器学习模型的工作流。此外,机器学习流程还定义了团队如何协作合作,以创建最有用的预测模型。 机器学习high level的流程 机器学习流程的关键步骤包括问题探索(Problem Exploration&a…

力扣题目训练(7)

2024年1月31日力扣题目训练 2024年1月31日力扣题目训练387. 字符串中的第一个唯一字符389. 找不同401. 二进制手表109. 有序链表转换二叉搜索树114. 二叉树展开为链表52. N 皇后 II 2024年1月31日力扣题目训练 2024年1月31日第七天编程训练,今天主要是进行一些题训…

2024杭州国际安防展览会:引领数字城市安全与智能未来

随着科技的不断进步,数字城市已经成为未来城市发展的重要趋势。作为数字城市建设的重要组成部分,安防技术的创新与应用对于保障城市安全、提高生活品质具有重要意义。为此,2024杭州国际安防展览会将于4月份在杭州国际博览中心隆重召开&#x…

DFS——连通性和搜索顺序

dfs的搜索是基于栈,但一般可以用用递归实现,实际上用的是系统栈。有内部搜索和外部搜索两种,内部搜索是在图的内部,内部搜索一般基于连通性,从一个点转移到另一个点,或者判断是否连通之类的问题&#xff0c…

react将选中本文自动滑动到容器可视区域内

// 自动滚动到可视区域内useEffect(() > {const target ref;const wrapper wrapperRef?.current;if (target && wrapperRef) {const rect target.getBoundingClientRect();const wrapperRect wrapper.getBoundingClientRect();const isVisible rect.bottom &l…

如何选择日本大带宽服务器?

随着互联网的高速发展,对于大带宽服务器的需求也日益增长。而在日本,由于其先进的网络基础设施和数据中心技术,大带宽服务器成为了许多企业和开发者的首选。那么,如何选择合适的日本大带宽服务器呢? 首先,了解自己的需…

linux☞ Centos 基础篇

切换用户 重启系统、退出 su 用户 ### su switch user 重启系统 reboot 退出当前账户 logout 或者 exit 或者 CtrlD 修改网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEthernet:指明网卡类型为以太网 DEVICEens33:指定当前配置的…

c++类和对象(二)

类与对象 一.类的6个默认成员函数1.1类的6个默认成员函数 二.构造函数2.1.1构造函数的概念2.1.2构造函数的特性 三.析构函数3.1.1概念3.1.2特点 四.拷贝函数4.1.1概念4.1.2特征 一.类的6个默认成员函数 1.1类的6个默认成员函数 在C中,如果在一个类中什么成员都没有…

docker maven插件使用介绍

1、配置docker连接 开放docker tcp连接参考本专栏下令一篇文章 2、docker service窗口 3、根据dockerfile 构建镜像 注意 idea 用通过管理员身份启动,否则连不上docker 构建前添加maven goal 打包 4、运行镜像 创建容器 5、运行docker compose 报错 需要先配置d…

Java并发之synchronized详解

☆* o(≧▽≦)o *☆嗨~我是小奥🍹 📄📄📄个人博客:小奥的博客 📄📄📄CSDN:个人CSDN 📙📙📙Github:传送门 📅&a…

QtAV学习:(一)Windows下编译QtAV

QtAV 主页: QtAV by wang-bin 作者的编译构建说明文档: Build QtAV wang-bin/QtAV Wiki GitHub 我的编译环境: 编译环境:win10/msvc2015/Qt5.6.3 第一步:GitHub拉取代码,执行子模块初始化 地址: …