海城市网站建设/线上营销技巧和营销方法
文章目录
- 一、展开运算符的基本用法
- 1. 展开数组
- 2. 展开对象
- 二、展开运算符的实际应用
- 1. 合并数组
- 2. 数组的浅拷贝
- 3. 合并对象
- 4. 对象的浅拷贝
- 5. 更新对象属性
- 三、展开运算符的高级用法
- 1. 在函数参数中使用
- 2. 嵌套数组的展开
- 3. 深拷贝对象
- 4. 动态属性名
- 四、注意事项和最佳实践
在现代JavaScript编程中,展开运算符(Spread Operator)是一种非常强大且灵活的语法糖。它使用三个连续的点(
...
)表示,广泛应用于数组和对象操作中。本文将详细介绍展开运算符的基本用法、实际应用以及一些高级技巧,帮助你全面掌握这一重要特性。
一、展开运算符的基本用法
展开运算符最初在ES6(ECMAScript 2015)中引入,主要用于数组,但在ES9(ECMAScript 2018)中扩展到了对象。它可以将一个数组或对象展开成单独的元素或属性,具体用法如下:
1. 展开数组
展开运算符可以将一个数组展开成单独的元素,用于创建新的数组或函数调用。
示例
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5, 6];console.log(arr2); // 输出: [1, 2, 3, 4, 5, 6]
在函数调用中使用:
function sum(a, b, c) {return a + b + c;
}const numbers = [1, 2, 3];console.log(sum(...numbers)); // 输出: 6
2. 展开对象
展开运算符可以将一个对象的所有可枚举属性展开到另一个对象中,便于对象的合并和浅拷贝。
const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1, c: 3 };console.log(obj2); // 输出: { a: 1, b: 2, c: 3 }
二、展开运算符的实际应用
展开运算符在日常开发中非常实用,以下是一些常见的应用场景:
1. 合并数组
使用展开运算符可以方便地合并多个数组:
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const arr3 = [...arr1, ...arr2];console.log(arr3); // 输出: [1, 2, 3, 4, 5, 6]
2. 数组的浅拷贝
展开运算符可以用于创建数组的浅拷贝:
const arr = [1, 2, 3];
const arrCopy = [...arr];console.log(arrCopy); // 输出: [1, 2, 3]
3. 合并对象
可以使用展开运算符来合并多个对象:
const obj1 = { a: 1, b: 2 };
const obj2 = { c: 3, d: 4 };
const obj3 = { ...obj1, ...obj2 };console.log(obj3); // 输出: { a: 1, b: 2, c: 3, d: 4 }
4. 对象的浅拷贝
展开运算符也可以用于对象的浅拷贝:
const obj = { a: 1, b: 2 };
const objCopy = { ...obj };console.log(objCopy); // 输出: { a: 1, b: 2 }
5. 更新对象属性
使用展开运算符可以方便地更新对象的属性,而不改变原对象:
const obj = { a: 1, b: 2 };
const updatedObj = { ...obj, b: 3 };console.log(updatedObj); // 输出: { a: 1, b: 3 }
三、展开运算符的高级用法
展开运算符除了基本的数组和对象操作外,还可以在许多高级场景中使用,例如函数参数处理和嵌套结构的展开。
1. 在函数参数中使用
展开运算符可以用于函数参数,特别是处理不定数量的参数时非常方便:
function sum(...args) {return args.reduce((acc, val) => acc + val, 0);
}console.log(sum(1, 2, 3, 4)); // 输出: 10
2. 嵌套数组的展开
对于嵌套数组,可以使用展开运算符展开其中的一层或多层:
const nestedArr = [1, [2, 3], [4, 5]];
const flatArr = [...nestedArr];console.log(flatArr); // 输出: [1, [2, 3], [4, 5]]
要完全展开嵌套数组,可以结合其他方法,如 Array.prototype.flat
:
const nestedArr = [1, [2, 3], [4, 5]];
const flatArr = nestedArr.flat();console.log(flatArr); // 输出: [1, 2, 3, 4, 5]
3. 深拷贝对象
展开运算符只能做浅拷贝,要进行深拷贝,可以结合其他方法使用:
const obj = { a: 1, b: { c: 2 } };
const deepCopy = JSON.parse(JSON.stringify(obj));console.log(deepCopy); // 输出: { a: 1, b: { c: 2 } }
4. 动态属性名
在展开对象时,结合计算属性名语法,可以动态设置属性名。计算属性名语法允许我们在定义对象时使用表达式计算出属性的键名。展开运算符则用于将一个对象的所有属性展开到另一个对象中。将这两者结合,可以实现非常灵活的对象构建方式。
动态属性名的基本用法
在对象字面量中,方括号 []
内的表达式会被计算,其结果将作为属性名。这在需要根据变量值或运行时动态确定属性名时特别有用。
示例详解
以下示例展示了如何使用计算属性名和展开运算符动态设置对象的属性名:
const key = 'name'; // 动态键名
const value = 'Alice'; // 动态键值const obj = {[key]: value, // 使用计算属性名语法,将变量key的值作为属性名,value的值作为属性值...{ age: 25 } // 展开另一个对象,将其属性添加到当前对象中
};console.log(obj); // 输出: { name: 'Alice', age: 25 }
四、注意事项和最佳实践
尽管展开运算符非常强大,但在使用时需要注意以下几点:
- 浅拷贝的局限性
展开运算符只进行浅拷贝,对于嵌套对象或数组的深层次数据,需要额外处理。
- 避免重复键名
在合并对象时,如果有重复的键名,后面的值会覆盖前面的值:
const obj1 = { a: 1, b: 2 };
const obj2 = { b: 3, c: 4 };
const mergedObj = { ...obj1, ...obj2 };console.log(mergedObj); // 输出: { a: 1, b: 3, c: 4 }
- 性能考虑
在处理大数据量时,频繁使用展开运算符可能会影响性能,需根据具体场景优化。
相关文章:

【JavaScript】展开运算符详解
文章目录 一、展开运算符的基本用法1. 展开数组2. 展开对象 二、展开运算符的实际应用1. 合并数组2. 数组的浅拷贝3. 合并对象4. 对象的浅拷贝5. 更新对象属性 三、展开运算符的高级用法1. 在函数参数中使用2. 嵌套数组的展开3. 深拷贝对象4. 动态属性名 四、注意事项和最佳实践…...

麒麟V10系统统一认证子系统国际化
在适配麒麟V10系统统一认证子系统国际化过程中, 遇到了很多的问题,关键是麒麟官方的文档对这部分也是粗略带过,遇到的问题有: (1)xgettext无法提取C源文件中目标待翻译的字符串。 (2)使用msgf…...

C语言进阶 13. 文件
C语言进阶 13. 文件 文章目录 C语言进阶 13. 文件13.1. 格式化输入输出13.2. 文件输入输出13.3. 二进制文件13.4. 按位运算13.5. 移位运算13.6. 位运算例子13.7. 位段 13.1. 格式化输入输出 格式化输入输出: printf %[flags][width][.prec][hlL]type scanf %[flags]type %[fl…...

LinuxCentos中ELK日志分析系统的部署(详细教程8K字)附图片
🏡作者主页:点击! 🐧Linux基础知识(初学):点击! 🐧Linux高级管理防护和群集专栏:点击! 🔐Linux中firewalld防火墙:点击! ⏰️创作…...

Vscode ssh Could not establish connection to
错误表现 上午还能正常用vs code连接服务器看代码,中午吃个饭关闭vscode再重新打开输入密码后就提示 Could not establish connection to xxxx 然后我用终端敲ssh的命令连接,结果是能正常连接。 解决方法 踩坑1 网上直接搜Could not establish con…...

数字陷波器的设计和仿真(Matlab+C)
目录 一、数字陷波器的模型 二、Matlab仿真 1. 示例1 2. 示例2 三、C语言仿真 1. 由系统函数计算差分方程 2. 示例代码 一、数字陷波器的模型 二、Matlab仿真 1. 示例1 clear clc f0=100;%滤掉的100Hz fs=1000;%大于两倍的信号最高频率 r=0.9; w0=2*pi*f0/fs;%转换到…...

[玄机]流量特征分析-常见攻击事件 tomcat
题目网址【玄机】:https://xj.edisec.net/ Tomcat是一个开源的Java Servlet容器,它实现了Java Servlet和JavaServer Pages (JSP) 技术,提供了一个运行这些应用程序的Web服务器环境。Tomcat由Apache软件基金会的Jakarta项目开发,是…...

【TOOLS】Project 2 Maven Central
发布自己的项目到maven中央仓库 Maven Central Account 访问:https://central.sonatype.com/,点击右上角,根据提示注册账号 构建User token ,用于访问中央仓库的API: 点击右上角,查看账户点击Generate Us…...

【Opencv】模糊
消除噪声 用该像素周围的平均值代替该像素值 4个函数 blur():最经典的 import os import cv2 img cv2.imread(os.path.join(.,dog.jpg)) k_size 7 #窗口大小,数字越大,模糊越强 img_blur cv2.blur(img,(k_size,k_size)) #窗口是正方形ÿ…...

函数式编程范式
文章目录 函数式编程范式不可变性(Immutable)纯函数(Pure Functions)函数作为一等公民(First-Class Functions)高阶函数(Higher-Order Functions函数组合(Function Composition&…...

特征缩放的秘籍:sklearn中的数据标准化技术
特征缩放的秘籍:sklearn中的数据标准化技术 在机器学习中,特征缩放(Feature Scaling)是数据预处理的重要步骤,它确保了不同量纲和范围的特征在模型训练中具有相同的重要性。Scikit-learn(简称sklearn&…...

hdfs文件系统
简述什么是HDFS,以及HDFS作用 ? HDFS在Hadoop中的作用是为海量的数据提供了存储,能提供高吞吐量的数据访问,HDFS有高容错性的 特点,并且设计用来部署在低廉的硬件上;而且它提供高吞吐量来访问应用程序的数…...

基于STM32设计的个人健康检测仪(华为云IOT)(191)
基于STM32设计的个人健康检测仪(华为云IOT)(191) 文章目录 一、设计需求1.1 设计需求总结1.2 设计思路【1】整体设计思路【2】整体构架【3】ESP8266模块配置【4】上位机开发思路【5】供电方式1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】课题研究的意义【…...

面试:CUDA Tiling 和 CPU tiling 技术详解
目录 一、CUDA Tiling 和 CPU Tiling 技术概述 (一)技术原理 (二)应用场景 (三)优势和劣势 二、Tiling 技术在深度学习中的应用 三、Tiling 技术的缺点 一、CUDA Tiling 和 CPU Tiling 技术概述 Til…...

SQL语句中,`TRUNCATE` 和 `DELETE`的区别
TRUNCATE 和 DELETE 是 SQL 中用于删除表中数据的两种命令,它们有一些关键区别: 1. 基本区别 DELETE: 删除表中的数据,但不会删除表结构和索引。可以使用 WHERE 子句来删除特定的记录,也可以不使用 WHERE 子句来删除所有记录。会…...

【Git】.gitignore全局配置与忽略匹配规则详解
设置全局配置 1)在C:/Users/用户名/目录下创建.gitignore文件,在里面添加忽略规则。 如何创建 .gitignore 文件? 新建一个.txt文件,重命名(包括后缀.txt)为 .gitignore 即可。 2)将.gitignore设…...

基于 YOLO V10 Fine-Tuning 训练自定义的目标检测模型
一、YOLO V10 在本专栏的前面几篇文章中,我们使用 ultralytics 公司开源发布的 YOLO-V8 模型,分别 Fine-Tuning 实验了 目标检测、关键点检测、分类 任务,实验后发现效果都非常的不错,但它已经不是最强的了。最新的 YOLO-V10 已经…...

Java学习2
1 如果要使用Long类型的变量,在数据值的后面加上L为后缀(可以是大写也可以是小写),例如 Long i9999999L; 2 如果要使用float类型的变量,在数据值的后面加上F为后缀(可以是大写也可以是小写)&a…...

CSS、less、 Sass、
1 CSS 1.1 css中.a.b 与 .a .b(中间有空格)的区别 区别: .a.b是获取同时含有a和b的元素.a .b(中间有空格),是获取.a元素下的所有.b元素<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name=&quo…...

北京大学:利用好不确定性,8B小模型也能超越GPT-4
大模型有一个显著的特点,那就是不确定性——对于特定输入,相同的LLM在不同解码配置下可能生成显著不同的输出。 比如问一问chatgpt“今天开心吗?”,可以得到两种不同的回答。 常用的解码策略有两种,一个是贪婪解码&am…...

哪些云服务商已通过了等保2.0合规性评估?
已通过等保2.0合规性评估的云服务商 根据最新的搜索结果,以下是已通过等保2.0合规性评估的云服务商: 阿里云:阿里云的“电子政务云平台系统”是全国首个通过等保2.0国标测评的云平台,显示了其在云计算领域的安全合规能力。华为云…...

PHP在线加密系统源码
历时半年,它再一次迎来更新[飘过] 刚刚发的那个有点问题,重新修了一下 本次更新内容有点多 1. 更新加密算法(这应该是最后一次更新加密算法了,以后主要更新都在框架功能上面了) 2. 适配php56-php74 3. 取消批量加…...

OpenCV学习笔记 比较基于RANSAC、最小二乘算法的拟合
一、RANSAC算法 https://skydance.blog.csdn.net/article/details/134887458https://skydance.blog.csdn.net/article/details/134887458 二、最小二乘算法 https://skydance.blog.csdn.net/article/details/115413982...

前端JS特效第53集:带声音的烟花模拟绽放特效插件
带声音的烟花模拟绽放特效插件,先来看看效果: 部分核心的代码如下(全部代码在文章末尾): <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>Firework Simulator v2&…...

好展位,抢先订!2025浙江(玉环)机械展
2025第18届浙江(玉环)机械工业展览会 时间地点:2025年4月25-28日 玉环会展中心 近年来,随着玉环工业经济的蓬勃发展,汽摩配件、阀门水暖五金产业、铜加工、眼镜配件、金属加工生产等行业,如同贪婪的巨人&…...

Java面试八股之Spring如何解决循环依赖
Spring如何解决循环依赖 在Spring框架中,循环依赖问题通常发生在两个或多个Bean相互依赖的情况下。Spring为了解决循环依赖问题,采用了不同的策略,这些策略主要取决于Bean的作用域以及依赖注入的方式。下面是一些关键点: 单例Be…...

如何为 SQL Server 设置强密码以增强安全性?
为 SQL Server 设置强密码是增强数据库安全性的重要步骤。以下是一些关键步骤和最佳实践: 1. 使用复杂密码 长度:密码应至少为 12 个字符。字符类型:包括大写字母、小写字母、数字和特殊字符(如 !#$%^&*())。避免…...

C语言实现三子棋
通过一段时间的学习,我们已经能够较为熟练地使用分支语句,循环语句,创建函数,创建数组,创建随机数等。之前我们做过一个扫雷游戏,今天让我们再尝试创作一个三子棋游戏吧~ 一、三子棋游戏的思路 三子棋的游…...

昇思25天学习打卡营第XX天|RNN实现情感分类
希望代码能维持开源维护状态hhh,要是再文件整理下就更好了,现在好乱,不能好fork tutorials/application/source_zh_cn/nlp/sentiment_analysis.ipynb MindSpore/docs - Gitee.com...

linux深度学习环境配置(cuda,pytorch)
显卡驱动 首先查看linux服务器是否存在显卡驱动,可以输入以下命令 nvidia-smi如果没有直接显示下面的画面 则进行下面的步骤: ubuntu-drivers devices sudo ubuntu-drivers autoinstall上述步骤的意思是直接在线安装 然后重启linux服务器 reboot发现…...