ES6解构赋值详解;全面掌握:JavaScript解构赋值的终极指南

目录

全面掌握:JavaScript解构赋值的终极指南

一、数组解构赋值

1、基本用法

2、跳过元素

3、剩余元素

4、默认值

二、对象解构赋值

1、基本用法

2、变量重命名

3、默认值

4、嵌套解构

三、复杂的嵌套结构解构

四、函数参数解构赋值

1、对象解构作为函数参数

2、带有默认值的函数参数解构

五、解构赋值中的交换变量

六、解构赋值与遍历

1、解构数组中的对象

七、结合 rest 运算符

八、处理函数返回的对象或数组

九、实际应用中的注意事项

1、属性不存在时的情况

2、深度解构可能导致错误

十、总结


作者:watermelo37

涉及领域:Vue、SpingBoot、Docker、LLM、python等

-----------------------------------------------------------------------------------

-------温柔地对待温柔的人,包容的三观就是最大的温柔。-------

-----------------------------------------------------------------------------------

全面掌握:JavaScript解构赋值的终极指南

        解构赋值(Destructuring Assignment)是 ES6(ECMAScript 2015) 引入的一种强大且灵活的语法,允许将数组或对象中的数据提取到变量中。它可以极大地简化从复杂数据结构中获取数据的过程。在以下内容中,我将详细解释解构赋值的语法及其在实践中的应用。

一、数组解构赋值

        数组解构赋值是基于数组元素的顺序,将数组中的值依次赋值给对应的变量。

1、基本用法

const arr = [10, 20, 30];const [a, b, c] = arr;console.log(a); // 输出: 10
console.log(b); // 输出: 20
console.log(c); // 输出: 30

2、跳过元素

const arr = [10, 20, 30];const [a, , c] = arr;console.log(a); // 输出: 10
console.log(c); // 输出: 30

3、剩余元素

        使用剩余运算符 (...) 获取数组中的其余元素(这里要注意区分剩余运算符和拓展运算符噢)。

const arr = [10, 20, 30, 40];const [a, ...rest] = arr;console.log(a);    // 输出: 10
console.log(rest); // 输出: [20, 30, 40]

4、默认值

        当解构的数组没有足够的元素时,可以为变量提供默认值。

const arr = [10];const [a, b = 20] = arr;console.log(a); // 输出: 10
console.log(b); // 输出: 20

二、对象解构赋值

        对象解构赋值是基于属性名的匹配,将对象属性的值赋给变量。

1、基本用法

const obj = { name: 'Alice', age: 25 };const { name, age } = obj;console.log(name); // 输出: Alice
console.log(age);  // 输出: 25

2、变量重命名

        可以将对象属性的值赋给一个新的变量名。

const obj = { name: 'Alice', age: 25 };const { name: n, age: a } = obj;console.log(n); // 输出: Alice
console.log(a); // 输出: 25

3、默认值

        如果对象中没有该属性,可以为变量提供默认值。

const obj = { name: 'Alice' };const { name, age = 30 } = obj;console.log(age); // 输出: 30

4、嵌套解构

        可以解构嵌套的对象或数组。

const obj = {user: {name: 'Alice',age: 25}
};const { user: { name, age } } = obj;console.log(name); // 输出: Alice
console.log(age);  // 输出: 25

三、复杂的嵌套结构解构

        解构可以处理复杂的数据结构,组合使用数组和对象的解构语法。

const data = {id: 1,name: 'John',locations: [{city: 'New York',state: 'NY'},{city: 'San Francisco',state: 'CA'}]
};const {name,locations: [{ city: city1 },{ city: city2 }]
} = data;console.log(name);   // 输出: John
console.log(city1);  // 输出: New York
console.log(city2);  // 输出: San Francisco

四、函数参数解构赋值

        在函数的参数中使用解构赋值,可以使函数更具可读性,特别是当参数是对象或数组时。

1、对象解构作为函数参数

function greet({ name, age }) {console.log(`Hello, ${name}. You are ${age} years old.`);
}const person = { name: 'Alice', age: 25 };greet(person); // 输出: Hello, Alice. You are 25 years old.

2、带有默认值的函数参数解构

function greet({ name = 'Anonymous', age = 0 } = {}) {console.log(`Hello, ${name}. You are ${age} years old.`);
}greet(); // 输出: Hello, Anonymous. You are 0 years old.

五、解构赋值中的交换变量

        解构赋值可以简洁地交换两个变量的值,而不需要使用临时变量。

let a = 1;
let b = 2;[a, b] = [b, a];console.log(a); // 输出: 2
console.log(b); // 输出: 1

六、解构赋值与遍历

        解构赋值可以与 for-of 循环结合使用,来遍历对象或数组。

1、解构数组中的对象

const users = [{ name: 'Alice', age: 25 },{ name: 'Bob', age: 30 }
];for (const { name, age } of users) {console.log(`${name} is ${age} years old.`);
}// 输出:
// Alice is 25 years old.
// Bob is 30 years old.

七、结合 rest 运算符

        解构赋值可以与 rest 运算符结合使用,用于提取剩余的属性。

const obj = { a: 1, b: 2, c: 3 };const { a, ...rest } = obj;console.log(a);    // 输出: 1
console.log(rest); // 输出: { b: 2, c: 3 }

八、处理函数返回的对象或数组

        解构赋值可以用于处理函数返回的复杂对象或数组,使得函数调用更加简洁。

function getUserInfo() {return {name: 'Alice',age: 25,location: {city: 'New York',state: 'NY'}};
}const {name,location: { city }
} = getUserInfo();console.log(name); // 输出: Alice
console.log(city); // 输出: New York

九、实际应用中的注意事项

1、属性不存在时的情况

        如果解构的对象中不存在某个属性,变量的值将是 undefined,因此使用默认值是一个好习惯。

const obj = { name: 'Alice' };const { name, age } = obj;console.log(age); // 输出: undefined

2、深度解构可能导致错误

        深度嵌套的解构可能会导致 undefined 错误,因此在实际应用中要谨慎。

const obj = { name: 'Alice' };// 错误:Cannot destructure property 'age' of 'undefined' as it is undefined.
const { name, age: { year } } = obj;

        在复杂数据结构中,务必确保数据的完整性,或为对象提供默认值。

十、总结

        解构赋值是一个强大且灵活的工具,它使得从数组和对象中提取数据变得更加简单和直观。通过掌握解构赋值的基本语法和实践,你可以写出更加简洁、可读性更强的代码。在实际项目中,解构赋值广泛应用于函数参数处理、变量交换、嵌套结构操作等场景,极大地提升了代码的灵活性和简洁度。

        只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

        更多优质内容,请关注:

        你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解

        通过array.filter()实现数组的数据筛选、数据清洗和链式调用

        el-table实现动态数据的实时排序,一篇文章讲清楚elementui的表格排序功能

        极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图

        shpfile转GeoJSON且控制转化精度;如何获取GeoJSON?GeoJson结构详解

        Docker 入门全攻略:安装、操作与常用命令指南

        通过array.reduce()实现数据汇总、条件筛选和映射、对象属性的扁平化、转换数据格式等

        巧用Array.forEach:简化循环与增强代码可读性

        Mapbox添加行政区矢量图层、分级设色图层、自定义鼠标悬浮框、添加天地图底图等

        管理数据必备!侦听器watch用法详解

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

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

相关文章

C/C++实现植物大战僵尸(PVZ)(打地鼠版)

🚀欢迎互三👉:程序猿方梓燚 💎💎 🚀关注博主,后期持续更新系列文章 🚀如果有错误感谢请大家批评指出,及时修改 🚀感谢大家点赞👍收藏⭐评论✍ 游戏…

2022高教社杯全国大学生数学建模竞赛C题 问题一(1) Python代码演示

目录 问题 11.1 对这些玻璃文物的表面风化与其玻璃类型、纹饰和颜色的关系进行分析数据探索 -- 单个分类变量的绘图树形图条形图扇形图雷达图Cramer’s V 相关分析统计检验列联表分析卡方检验Fisher检验绘图堆积条形图分组条形图分类模型Logistic回归随机森林import matplotlib…

GAN的损失函数和二元交叉熵损失的对应及代码

以下解释为GPT生成 这里有个问题,使用二元交叉熵,的时候生成器的损失如何体现 看代码 import torch import torch.nn as nn import torch.optim as optim# 设置设备为GPU或CPU device torch.device("cuda" if torch.cuda.is_available() el…

EndnoteX9安装及使用教程

EndnoteX9安装及使用教程 一、EndNote安装 1.1 下载 这里提供一个下载链接: 链接:https://pan.baidu.com/s/1RlGJksQ67YDIhz4tBmph6Q 提取码:5210 解压完成后,如下所示: 1.2 安装 双击右键进行安装 安装比较简单…

【C++11 —— 线程库】

C11 —— 线程库 thread类介绍线程函数参数原子性操作库(atomic)lock_guard与unique_lockmutex的种类lock_guardunique_lock 两个线程交替打印奇偶数 thread类介绍 在C11之前,涉及到多线程的问题,都是和平台相关的,比如windows和Linux下各有…

AI 时代程序员的应变之道

一、AI 浪潮来袭,编程界风云变幻 随着 AIGC 大语言模型如 ChatGPT、Midjourney、Claude 等的涌现,AI 辅助编程工具日益普及,程序员的工作方式正经历着深刻的变革。 分析公司 OReilly 日前发布的《2023 Generative AI in the Enterprise》报告…

【Linux基础】冯诺依曼体系结构操作系统的理解

目录 前言一,冯诺依曼体系1. 为什么有内存结构?2. 对硬件中数据流动的再理解 二,操作系统(Operator System)1. 概念2. 操作系统结构的层状划分3. 操作系统对硬件管理的理解4. 用户与操作系统的关系的理解5. 系统调用和库函数的关系6. 为什么要有操作系统…

策略路由与路由策略的区别

🐣个人主页 可惜已不在 🐤这篇在这个专栏 华为_可惜已不在的博客-CSDN博客 🐥有用的话就留下一个三连吧😼 目录 一、主体不同 二、方式不同 三、规则不同 四、定义和基本概念 一、主体不同 1、路由策略:是为了改…

android 删除系统原有的debug.keystore,系统运行的时候,重新生成新的debug.keystore,来完成App的运行。

1、先上一个图:这个是keystore无效的原因 之前在安装这个旧版本android studio的时候呢,安装过一版最新的android studio,然后通过模拟器跑过测试的demo。 2、运行旧的项目到模拟器的时候,就报错了: Execution failed…

后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0916)

接口文档: https://apifox.com/apidoc/shared-26c67aee-0233-4d23-aab7-08448fdf95ff/api-93850835 接口根路径: http://big-event-vue-api-t.itheima.net 本项目的技术栈 本项目技术栈基于 ES6、vue3、pinia、vue-router 、vite 、axios 和 element-plus http:/…

RabbitMQ(高阶使用)死信队列

文章内容是学习过程中的知识总结,如有纰漏,欢迎指正 文章目录 一、什么是死信队列? 二、死信队列使用场景 三、死信队列如何使用 四、打车超时处理 1.打车超时实现 以下是本篇文章正文内容 一、什么是死信队列? 先从概念解释上搞…

idea插件推荐之Cool Request

Cool Request是一款基于IDEA的HTTP调试工具,可以看成是轻量版的postman,它会自动扫描项目代码中所有API路径,按项目分组管理。一个类被定义为Controller且其中的方法被RequestMapping或者XXXMapping注解标注以后就会被扫描到。 对应方法左侧会…

智能硬件从零开始的设计生产流程

文章目录 市场分析团队组建ID设计结构设计pcba设计软件开发手板EVT开模DVTPVTMP 智能硬件研发是一个复杂的过程, 当然一件事要发出萌芽必须得有人, 有一天,几个合伙人凑在一起,说一起开发个智能硬件产品吧,于是故事开始了. 市场分析 合伙人: 万物互联的时代, 智能音箱已经成为…

LDR6020,单C口OTG,充放一体新潮流!

PD(Power Delivery)芯片实现单Type-C接口输入和输出OTG(On-The-Go)功能,主要是通过支持USB Power Delivery规范和OTG功能的特定硬件和软件设计来实现的。以下是对这一过程的具体解释: 一、PD芯片基础功能 …

Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用增强扩展(text2sql)

前言 我在上一篇文章中《Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用(text2sql)》 利用langchain 中create_sql_agent 创建一个数据库代理智能体,但是实测中发现,使用 create_sql_agent 在对话中&#x…

Qt控制开发板的LED

Qt控制开发板的LED 使用开发板的IO接口进行控制是嵌入式中非常重要的一点,就像冯诺依曼原理说的一样,一个计算机最起码要有输入输出吧,我们有了信息的接收和处理,那我们就要有输出。 我们在开发板上一般都是使用开发板的GPIO接口…

七、垃圾收集器ParNewCMS与底层三色标记算法详解

文章目录 垃圾收集算法分代收集理论标记-复制算法标记-清除算法标记-整理算法 垃圾收集器1.1 Serial收集器(-XX:UseSerialGC -XX:UseSerialOldGC)1.2 Parallel Scavenge收集器(-XX:UseParallelGC(年轻代),-XX:UseParallelOldGC(老年代))1.3 ParNew收集器(-XX:UseParNewGC)1.4 C…

MATLAB 可视化基础:绘图命令与应用

目录 1. 绘制子图1.1基本绘图命令1.2. 使用 subplot 函数1.3. 绘图类型 2.MATLAB 可视化进阶(以下代码均居于以上代码的数据定义上实现)2.1. 极坐标图2.3. 隐函数的绘制 3.总结 在数据分析和科学计算中,数据可视化是理解和解释结果的关键工具。今天,我将…

Text2vec -文本转向量

文章目录 一、关于 Text2vec1、Text2vec 是什么2、Features3、Demo4、News5、Evaluation英文匹配数据集的评测结果:中文匹配数据集的评测结果: 6、Release Models 二、Install三、使用1、文本向量表征1.2 Usage (HuggingFace Transformers)1.3 Usage (se…

标准库标头 <barrier>(C++20)学习

此头文件是线程支持库的一部分。 类模板 std::barrier 提供一种线程协调机制,阻塞已知大小的线程组直至该组中的所有线程到达该屏障。不同于 std::latch,屏障是可重用的:一旦到达的线程组被解除阻塞,即可重用同一屏障。与 std::l…