ES实用的深度解构赋值方法

  • ES6 中允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
  • 使用解构赋值可以将复杂的代码整理的更加干净整洁。

1.解构对象

在没有使用解构之前,想要确定对象中的某些属性,那么就需要从对象中获取属性然后赋值给变量,这样会让代码显得非常冗余,如下代码所示:

let obj = {name:"张三",age:22};
let name = obj.name;
let age = obj.age;
console.log(name,age);// 张三 22

1)基本解构格式

如果使用解构的话,只需要如下面格式所写即可,保持将变量名和对象属性名同名才可取到值。

let {name,age} = {name:"张三",age:22};
console.log(name,age);

2)变量别名

如果要解构的对象中的属性名和外部的名称重名了,将会报错,可以使用别名的方式进行解构,如下所示:

let name="王五";
let {name:newName,age} = {name:"张三",age:22};
console.log(newName,age);

3)变量默认值

如果目标对象属性中没有要解构的属性,不指定默认值,那么将会undefined,此时可以给解构变量写默认值,如下所示:

let {name,age,gender="男"} = {name:"张三",age:22};
console.log(name,age,gender);

此种为变量设置默认值的方法,常应用于函数参数中,加入调用函数时没传递参数,有可能会对函数运行造成错误,那就可以在形参位置进行对象解构,对变量指定默认值,如下代码所示:

function fn({name='李四',age=30}={}){console.log(name,age);
}
fn()

2.解构数组

解构数组和对象有些不同,解构对象的时候属性前后位置不影响,但是结构数组,需要按照索引顺序结构。

1)数组基础解构用法

如果在没有解构之前,需要拿到数组中的前3位字符串,那么只能按照下面这种按照索引值的方式定义变量,如下所示:

let arr = ["HTML5","JavaScript","Vue","React","NodeJS"];
let str1 = arr[0];
let str2 = arr[1];
let str3 = arr[2];
console.log(str1,str2,str3);// HTML5 JavaScript Vue

如果使用解构赋值的话,就可以展现位如下格式:

let [str1,str2,str3] = ["HTML5","JavaScript","Vue","React","NodeJS"];
console.log(str1,str2,str3);

基于这种特性,如果一次性想要定义多个变量,就可以使用这种解构的方式定义,相当于一次性定义了三个变量并对变量进行了赋值。

2)选择解构

数组的特性是按照索引值顺序执行的,如果只要取得数组最后几位,或者第几位,需要预留出其他值的位置,如下所示:

let [ , , , value1 ,value2] = ["HTML5","JavaScript","Vue","React","NodeJS"];
console.log(value1,value2);// React NodeJS

3)扩展运算符

在一个数组中解构,可以取得数组第一位,剩下的通过扩展运算符(展开运算符),统一放置到一个数组中,如下所示:

let [value,...other] = ["HTML5","JavaScript","Vue","React","NodeJS"];
console.log(value,other);// HTML5 ["JavaScript","Vue","React","NodeJS"]

4)默认值

同上面对象别名方式一致。

let [v1,v2,v3="Vue"] = ["HTML5","JavaScript"];
console.log(v1,v2,v3);// HTML5 JavaScript Vue

5)交换变量值

let name1 = "张三";
let name2 = "李四";
[name2,name1] = [name1,name2];
console.log(name1,name2);

3.解构混用

在实际开发中基本没有上面那种简单的结构,大多数都是数据结构比较复杂,用好了解构赋值才会让你的代码看起来更加整洁。
通过下面的示例演示一下混用解构的方法,以如下对象为例,想要获取代表作品works字段下面音乐作品music下的“鸡你太美”,应该如何操作:

let person = {name:"坤坤",age:25,like:['唱','跳','rap','篮球'],works:{music:['Wait Wait Wait','鸡你太美'],movies:['童话二分之一','鬼畜区常青树']},friend:['丞丞','大宝贝','大黑牛']
}

1)传统型

let result = person.works.music[1]
console.log(result);// 鸡你太美

2)浅层解构

let {works} =person
console.log(works.music[1]);

3)连续解构

let {works:{music}} =person
console.log(music[1]);

4)数组与对象混用

let {works:{music:[,result]}} =person
console.log(result);

5)解构+别名

let {works:{music:[,result],movies:newMov}} =person
console.log(result,newMov);

作者:咸虾米,如果对内容有更好的建议或者优化方案,请评论留言。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一篇了解Maven中的<optional>和<scope>使用

目录 Maven的依赖传递optional 与 scope 的区别scope 的可选值 Maven的依赖传递 依赖管理是maven提供的主要功能之一,无论我们需要什么依赖,只需将它们添加到 POM.xml 中,在构建或运行时所有必要的类和资源都会自动添加到项目的 classpath 中…

自己开发一种编程语言,可以同时开发鸿蒙,Android ios的三个平台的应用

我想要开发一种可以在,鸿蒙操作系统,Android操作系统,和ios操作系统运行的,编程语言,意思是自己开发一种编程语言,可以同时开发鸿蒙,Android ios的三个平台的应用,请问怎么实现,需要哪些技术,flutter为什么可以开发Android,ios应用…

DVWA靶场中的xss-反射型xss、存储型xss的low、medium、high的详细通关方法

目录 1.DVWA反射型xss (1)Low: (2)Medium: (3)Heigh 2.xss存储型 (1)Low: (2)Medium (3)He…

实现 Spring Boot 项目热重载,无需重启,省时省力

实现 Spring Boot 项目热重载,无需重启,省时省力 插件介绍 通过 JRebel 插件 实现 Spring Boot 项目热重载。类似于前端 Webpack 热重载功能 无需重启,省时省力 安装插件 打开 IDEA 在插件中搜索:JRebel 安装成功后重启IDEA …

1.SQL - 概述

1. SQL语句分类 • 数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等 • 数据操作语言:简称DML(Data …

一起玩儿物联网人工智能小车(ESP32)——17. 用ESP32的ADC功能读取电源电压

摘要:本文主要介绍如何使用ESP32的ADC功能,读取物联网智能小车的电池电压 今天介绍一个ESP32的新功能——如何利用ESP32的引脚,采集模拟量信息。在前面GPIO的学习中我们知道,可以利用GPIO的引脚读取外部设备输出的高低电平信号&am…

什么是LangChain

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 LangChain 是一个旨在简化使用大型语言模型(LLM)创建应用程序的框架。它提供了许多功能,使与LLM的合作变得更加容易&#xff0c…

【Mybatis】我抄袭了Mybatis,手写一套MyMybatis框架:学会使用mybatis框架

上一篇文章中,我们学习了通过JDBC与MySQL进行交互。如果我们平常在项目中使用mybatis框架作为我们的orm框架。这一次我们就来学习如何使用框架。我们项目中使用到maven。我们直接通过pom文件的方式给他引入进来。 MyBatis是一个简单而强大的持久层框架,…

SParC数据集介绍

导语 SParC是Text-to-SQL领域的一个多轮查询数据集。本篇博客将对该数据集论文和数据格式进行简要介绍。 SParC数据集概述 SParC是一个跨领域的多轮Text-to-SQL数据集。它包含有4298个问题轮次,大约有12k的自然语言问句到SQL标注的Question-SQL对。这些问题来自于…

多汗症是否会遗传?

多汗症确实具有一定的遗传倾向。 首先,多汗症在临床上是比较常见的疾病,并且给生活带来了很多困扰。其中,许多患者多汗症是有遗传倾向的,即这个病本身就有遗传的一个几率。尤其是病理性多汗症,遗传的可能性更大。 具…

JavaWeb的Servlet的入门和使用方法

1 什么是Servlet Servlet是Server Applet的简称,是用Java编写的是运行在 Web 服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet,可以收集来自网页表单的用户输…

提升FTP上传速度的方法(提升FTP下载速度的技巧)

在企业日常经营中,快速上传和下载文件至关重要。然而,在使用FTP(文件传输协议)进行文件传输时,速度可能成为瓶颈。为了提升工作效率,以下是一些建议,可以帮助企业提高FTP上传下载速度。 1、确保…

BERT的学习

BERT 1.前言 self-supervised learning是一种无监督学习的特殊形式,算法从数据本身生成标签或者目标,然后利用这些生成的目标来进行学习。(也就是说数据集的标签是模型自动生成的,不是由人为提供的。)例如&#xff0…

万能刷题小程序源码系统:功能强大+试题管理+题库分类+用户列表 附带完整的搭建教程

随着互联网技术的不断进步,线上学习已成为越来越多人的选择。刷题作为提高学习效果的重要方式,一直受到广大学生的喜爱。然而,市面上的刷题软件虽然繁多,但功能各异,质量参差不齐,使得很多用户在选择时感到…

偷流量、端口占用、网络负载高、socket创建释放异常等Android高阶TCP/IP网络问题定位思路

一,背景 通常一些偷流量、端口占用、网络负载高、socket创建释放异常等Android网络相关问题,可以通过使用tcpdump抓tcp/ip报文,来定位。但是tcpdump无进程信息,也没有APK包名信息,无法确认异常的报文来自哪些Apk或者n…

STM32F4系列单片机库函数模板工程创建

目录 一、工程配置 1、新建工程 2、芯片选择 3、工程子文件夹创建 (1)FWLIB文件夹添加文件 (2)CORE文件夹添加文件 (3)USER文件夹添加文件 4、工程设置 (1)工程中添加文件夹…

【前端技术】Vite vs Webpack

✨专栏介绍 在当今数字化时代,Web应用程序已经成为了人们生活和工作中不可或缺的一部分。而要构建出令人印象深刻且功能强大的Web应用程序,就需要掌握一系列前端技术。前端技术涵盖了HTML、CSS和JavaScript等核心技术,以及各种框架、库和工具…

Banana Pi BPI-M4 Berry 全志H618开发板快速使用手册

介绍 BPI-M4 Berry 开发板是一款功能强大的单板计算机 (SBC),利用 Allwinner H618 片上系统 (SoC) 的功能为开发人员提供令人印象深刻的性能和丰富的功能。与 Raspberry Pi 4b 类似,BPI-M4 Berry 拥有可比的 CPU 性能、LPDDR4 内存支持、集成 WiFi 和蓝…

人机验证码生成与验证:提升系统安全性

一、前言 为了防止机器人或脚本程序自动化攻击和滥用系统资源,很多网站和应用程序需要使用验证码来判断用户是否为真人。 一般登录都要求用户手动输入以验证身份的安全措施。验证码是一种通过生成包含随机字符的图像或文本,通常包含了不同大小写字母、数…

内网穿透的应用-Ubuntu安装XRDP远程桌面结合内网穿透实现远程桌面Ubuntu

文章目录 一、 同个局域网内远程桌面Ubuntu二、使用Windows远程桌面连接三、公网环境系统远程桌面Ubuntu1. 注册cpolar账号并安装2. 创建隧道,映射3389端口3. Windows远程桌面Ubuntu 四、 配置固定公网地址远程Ubuntu1. 保留固定TCP地址2. 配置固定的TCP地址3. 使用…