深入理解拓展运算符与剩余运算符:功能、用法与区别

简介: 拓展运算符和剩余运算符为JavaScript提供了更灵活的数组和对象操作方法。在实际开发中,合理运用这两个运算符可以大大简化代码,提高代码的可读性和维护性。拓展运算符展开元素,而剩余运算符收集剩余元素——二者在功能上互补,是编写现代JavaScript代码的强大工具。 其他编程语言中也有类似的功能,例如 Python 的星号(*)和双星号(**)运算符,Ruby 的 splat()运算符,Swift 的 variadic parameters,以及 Kotlin 的 vararg 关键字。这些语言的运算符在概念上与 JavaScript 的扩展运算符和剩余参数相似,但具体的语法


作者:watermelo37

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

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

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

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

image.gif 编辑

深入理解拓展运算符与剩余运算符:功能、用法与区别

       在现代JavaScript开发中,ES6引入的拓展运算符(Spread Operator)和剩余运算符(Rest Operator)让代码更加简洁和灵活。无论是数组、对象的拆分与合并,还是函数参数的处理,这两个运算符都是非常实用的工具。

image.gif 编辑

一、拓展运算符(Spread Operator)

1、什么是拓展运算符?

       拓展运算符(Spread Operator)由三个连续的点 ... 表示,用于将一个可迭代对象(例如数组、字符串等)展开成多个元素。拓展运算符可以应用在数组或对象上,实现数据的拆分、复制、合并等操作。

2、拓展运算符的作用

拓展运算符主要用于:

  • 数组的复制和合并
  • 对象的复制和合并
  • 函数调用时传递数组作为多个参数

3、拓展运算符的使用示例

①数组展开与合并

const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const combinedArray = [...arr1, ...arr2]; // [1, 2, 3, 4, 5, 6]
const copiedArray = [...arr1]; // [1, 2, 3]

image.gif

②对象展开与合并

const obj1 = { a: 1, b: 2 };
const obj2 = { b: 3, c: 4 };
const combinedObject = { ...obj1, ...obj2 }; // { a: 1, b: 3, c: 4 }

image.gif

③函数调用时传递数组作为参数

function sum(x, y, z) {
  return x + y + z;
}
const numbers = [1, 2, 3];
console.log(sum(...numbers)); // 6

image.gif

       拓展运算符解构了数组或对象中的每一个元素或属性,将其插入到当前上下文中。

二、剩余运算符(Rest Operator)

1、什么是剩余运算符?

       剩余运算符(Rest Operator)也是由 ... 表示,但在函数参数或解构赋值中使用,通常用来接收不确定数量的参数或对象属性,并将其“收集”到一个数组或对象中。

解构赋值:

2、剩余运算符的作用

剩余运算符主要用于:

  • 函数参数的收集
  • 对象或数组解构赋值时的剩余元素收集

3、剩余运算符的使用示例

①函数参数的收集

function sum(...args) {
  return args.reduce((total, num) => total + num, 0);
}
console.log(sum(1, 2, 3, 4)); // 10

image.gif

②对象解构时的剩余属性

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

image.gif

③数组解构时的剩余元素

const arr = [1, 2, 3, 4];
const [first, ...others] = arr;
console.log(first); // 1
console.log(others); // [2, 3, 4]

image.gif

       剩余运算符将未被单独声明的剩余元素放入一个新数组或对象,便于处理不确定数量的参数或数据。

image.gif 编辑

三、拓展运算符与剩余运算符的相同点

  • 符号一致:二者都是用三个连续的点号 ... 表示。
  • 数组或对象操作:都可以用在数组或对象上,但应用场景有所不同。
  • 简化代码:都可以简化数组和对象的操作,代码更加清晰、简洁。

四、拓展运算符与剩余运算符的区别

  • 用法不同:拓展运算符用于展开已有的数组或对象,而剩余运算符用于收集多个元素或属性。
  • 位置不同:拓展运算符用于函数调用、数组或对象的右侧;剩余运算符通常用在函数参数或解构赋值的左侧。
  • 功能不同:拓展运算符将集合分解成单个元素;剩余运算符则将多个元素合并成一个数组或对象。

五、与拓展运算符、剩余运算符相关的知识点

1、在函数参数中组合使用

       在某些情况下,我们可以同时使用拓展运算符和剩余运算符,比如:

function mix(a, b, ...rest) {
  console.log(a, b); // 第一个和第二个参数
  console.log(rest); // 剩余参数
}
mix(...[1, 2, 3, 4, 5]); // 1, 2  -> [3, 4, 5]

image.gif

        第一个是剩余运算符,第二个是拓展运算符。

2、展开字符串

       拓展运算符也可以将字符串展开成字符数组:

const str = "Hello";
const chars = [...str]; // ['H', 'e', 'l', 'l', 'o']

image.gif

3、复制对象与深拷贝

       使用拓展运算符可以简单地复制对象,但它是浅拷贝:

const obj = { x: 1, y: { z: 2 } };
const shallowCopy = { ...obj };
shallowCopy.y.z = 3;
console.log(obj.y.z); // 3 (因为是浅拷贝)

image.gif

4、与Array.from的结合

       拓展运算符对于将类数组对象转换为真正的数组非常有用,比如:

const nodeList = document.querySelectorAll("div");
const nodeArray = [...nodeList];

image.gif

       这里的 document.querySelectorAll("div") 方法会返回一个包含所有 <div> 元素的 NodeList。NodeList 类似于数组,因为它可以被索引并且有 length 属性,但是它并不是真正的数组,所以无法直接使用数组的方法(如 map、filter 等)。

       使用拓展运算符(...)将 nodeList 展开为单个元素,然后将这些元素放入一个新数组 nodeArray 中。最终结果是 nodeArray 变成一个数组,其中包含了所有的 <div> 元素。这样处理之后,nodeArray 就是真正的数组,可以使用任何数组方法,比如 map、filter、forEach 等,这为后续操作提供了更多的便利。

// 初始html结构
<div>First Div</div>
<div>Second Div</div>
<div>Third Div</div>
// 拓展运算符处理
const nodeList = document.querySelectorAll("div");
const nodeArray = [...nodeList];
// 在nodeArray使用array特有的方法
nodeArray.forEach(div => console.log(div.textContent));
// 输出
First Div
Second Div
Third Div

image.gif

六、总结

       拓展运算符和剩余运算符为JavaScript提供了更灵活的数组和对象操作方法。在实际开发中,合理运用这两个运算符可以大大简化代码,提高代码的可读性和维护性。拓展运算符展开元素,而剩余运算符收集剩余元素——二者在功能上互补,是编写现代JavaScript代码的强大工具。

       其他编程语言中也有类似的功能,例如 Python 的星号(*)和双星号(**)运算符,Ruby 的 splat()运算符,Swift 的 variadic parameters,以及 Kotlin 的 vararg 关键字。这些语言的运算符在概念上与 JavaScript 的扩展运算符和剩余参数相似,但具体的语法和使用方式可能会有所不同。

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

       其他热门文章,请关注:

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

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

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

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

       在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境

       干货含源码!如何用Java后端操作Docker(命令行篇)

       JavaScript中闭包详解+举例,闭包的各种实践场景:高级技巧与实用指南

       Dockerfile全面指南:从基础到进阶,掌握容器化构建的核心工具

       MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver

       TreeSize:免费的磁盘清理与管理神器,解决C盘爆满的燃眉之急

       Idea启动SpringBoot程序报错:Port 8082 was already in use;端口冲突的原理与解决方案

       PDF预览:利用vue3-pdf-app实现前端PDF在线展示

相关文章
|
8月前
|
JavaScript 前端开发 API
你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解
onMounted作为vue3中最常用的钩子函数之一,能够灵活、随心应手的使用是每个Vue开发者的必修课,同时根据其不同写法的特性,来选择最合适最有利于维护的写法。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
10月前
|
人工智能 监控 安全
云端问道18期实践教学-AI 浪潮下的数据安全管理实践
本文主要介绍AI浪潮下的数据安全管理实践,主要分为背景介绍、Access Point、Bucket三个部分
332 54
|
8月前
|
Ubuntu Linux 应用服务中间件
Linux使用cpulimit对CPU使用率进行限制
cpulimit是一款简单易用的CPU使用率限制工具,支持对特定程序或整个CPU使用率进行限制。可通过源安装(如`yum`或`apt-get`)或编译安装获取。使用时,可针对程序名、进程号或绝对路径设置CPU占用上限(如`cpulimit -e xmrig -l 60 -b`)。ROOT用户可限制所有进程,普通用户仅限于权限范围内进程。注意,CPU百分比基于实际核心数(单核100%,双核200%,依此类推)。
556 7
|
7月前
|
消息中间件 运维 监控
智能运维,由你定义:SAE自定义日志与监控解决方案
通过引入 Sidecar 容器的技术,SAE 为用户提供了更强大的自定义日志与监控解决方案,帮助用户轻松实现日志采集、监控指标收集等功能。未来,SAE 将会支持 istio 多租场景,帮助用户更高效地部署和管理服务网格。
493 52
|
7月前
|
人工智能 监控 安全
从 DeepSeek 敏感信息泄露谈可观测系统的数据安全预防
探讨了 SLS 中增强数据安全的几种方式:权限精细化管控有效减少了潜在安全风险;接入层脱敏技术阻止敏感数据落库,提升了隐私保护;StoreView 字段集控制通过限制查询数据范围,降低数据泄露损害。智能监控系统提供实时监测,快速识别并阻断异常拖库行为,为企业提供了迅速响应和抵御威胁的能力。
|
8月前
|
机器学习/深度学习 传感器 搜索推荐
《解析鸿蒙原生智能:解锁精准用户意图理解的密码》
鸿蒙系统以其原生智能特性,通过多维感知、大模型赋能、知识图谱、机器学习及意图框架五大核心技术,精准理解用户意图,开创智能交互新篇章。多维感知融合语音、图像与传感器数据,捕捉用户需求;大模型深度解析语言语义,提供个性化服务;知识图谱构建信息网络,提升搜索精度;机器学习持续优化交互体验;意图框架高效匹配服务。鸿蒙原生智能不仅提升了人机交互效率,更为未来智能化生活奠定了坚实基础。
212 10
|
8月前
|
存储 网络协议 网络安全
Hyper-V Win10虚拟机配置常见问题
在配置Hyper-V Win10虚拟机时,用户常面临网络连接、虚拟交换机配置、资源分配及其他问题。例如,虚拟机无法获取IP地址可能源于DHCP服务异常,需检查并启动该服务;外部虚拟交换机配置错误则需确保物理网络适配器正确连接。此外,内存不足或虚拟硬盘性能瓶颈也会影响运行效果。通过合理调整资源配置、优化设置及遵循最佳实践,可有效解决这些问题。
|
8月前
|
存储 人工智能 自然语言处理
智能体模拟《西部世界》一样的社会,复旦大学等出了篇系统综述
复旦大学等机构学者发表综述,探讨基于大型语言模型(LLM)的智能体在社会模拟中的应用与前景。文章将智能体模拟分为个体、场景和社会三种类型,为社会学研究提供全新视角和工具。然而,该技术也面临准确性、隐私保护及社会不平等等伦理挑战,需加强技术标准与法律法规建设以推动其健康发展。
249 9
|
8月前
|
存储 监控 固态存储
RAID10怎么创建?RAID10创建详细步骤
RAID 10(RAID 1+0)是一种结合了RAID 1镜像与RAID 0条带化技术的存储阵列,兼具高性能和数据冗余优势。其创建需7步:硬件准备、配置RAID设备、选择级别、添加硬盘、设置条带化大小、保存退出及初始化阵列。RAID 10通过两两分组构建RAID 1镜像,再以RAID 0连接提升性能。但成本较高,且若单镜像内两盘同时损坏,数据将无法恢复。未来,SSD普及、NVMe应用及软件定义存储等趋势将进一步优化RAID 10性能。创建时需注意备份数据、选用可靠硬件并定期维护监控。
513 7
下一篇
开通oss服务