js中 剩余运算符(Rest Operator )(...)和展开运算符(Spread Operator)(...)的区别及用法

1、基本说明

在JavaScript中,剩余运算符(Rest Operator)和展开运算符(Spread Operator)虽然在某些方面有相似之处,但它们各自有不同的用途和功能。下面详细解释这两种运算符的区别:

1.1. 剩余运算符(Rest Operator)

剩余运算符 是用在函数参数中,用来收集剩余的参数到一个数组中。它使用三个点(...)表示。这在处理不定数量的参数时非常有用。

1.2. 展开运算符(Spread Operator)

展开运算符 用于将数组元素或对象的属性"展开"到某个位置,比如在函数调用、数组构造或对象字面量中。它同样使用三个点(...)表示。

我们会发现都是三个点(...)表示。

2、实例说明

剩余运算符(Rest Operator)

复制代码
function sum(...numbers: any[]): number {
  // 验证输入并过滤非数字类型
  const validatedNumbers = numbers.filter(num => typeof num === 'number');

  // 如果过滤后数组为空,直接返回 0
  if (validatedNumbers.length === 0) {
    return 0;
  }

  // 使用 reduce 计算总和
  return validatedNumbers.reduce((acc, current) => acc + current, 0);
}

console.log(sum(1, 2, 3)); // 输出: 6
console.log(sum(1, "2", 3)); // 输出: 4 (过滤掉非数字 "2")
console.log(sum()); // 输出: 0 (无参数)
console.log(sum(null, undefined, NaN, {}, [])); // 输出: 0 (所有参数被过滤)
console.log(sum(10, -5, 3.5)); // 输出: 8.5

在这个例子中,...numbers 收集了所有传递给 sum 函数的参数到一个名为 numbers 的数组中。

展开运算符(Spread Operator)

数组展开:

复制代码
let arr1 = [1, 2, 3];
let arr2 = [...arr1, 4, 5];
console.log(arr2); // 输出:[1, 2, 3, 4, 5]

对象展开:

复制代码
let obj1 = { a: 1, b: 2 };
let obj2 = { ...obj1, c: 3 };
console.log(obj2); // 输出:{ a: 1, b: 2, c: 3 }

3、区别总结

  • 剩余运算符(Rest Operator):用于函数参数中,用来收集多个参数为一个数组。

  • 展开运算符(Spread Operator):用于将数组或对象的元素/属性"展开"到另一个数组或对象中。

4、使用场景

  • 使用剩余运算符(Rest Operator)当你需要处理不定数量的参数时。

  • 使用展开运算符(Spread Operator)当你需要将一个数组或对象的元素/属性分散到另一个数组或对象中时。

这两种运算符在JavaScript中提供了强大的功能,使得处理数组和对象时更加灵活和方便。

相关推荐
l1t1 小时前
DeepSeek 4.1总结的Tom Lane 谈塑造 Postgres 三十年历程的架构决策
开发语言·数据库·postgresql·架构
变与不变8061 小时前
Debug 调试与排错规范
前端·javascript
djarmy7 小时前
MAIN.c(1): warning C318: can’t open file ‘STC8G.H’ 报错 解决 分析
c语言·开发语言·mongodb
HEJOO97 小时前
深入理解 Java volatile 关键字:原理、用法与常见误区
java·开发语言·spring
曹牧7 小时前
Java:no content to map due to end of input
java·开发语言
梦梦代码精8 小时前
《回收租赁系统技术选型避坑指南:业务闭环与二开自由度详解》
开发语言·低代码·docker·开源·代码规范
隔窗听雨眠8 小时前
记一次SQL Server数据库性能分析:从CPU100%到单配置修复的完整诊断
开发语言·数据库·php
David猪大卫8 小时前
【C++修炼】智能指针使用及原理
开发语言·c++·经验分享·笔记·学习·考研·面试
charlie1145141918 小时前
现代Qt开发之图像处理进阶:像素操作与格式转换
开发语言·图像处理·qt
李永奉8 小时前
中科蓝讯SDK开发-BT893x 面条耳机连接vivo手机后连接APP端,最后手机端设置页面手动断开蓝牙连接,此时耳机端假断开
c语言·开发语言·嵌入式硬件·物联网·智能手机·电脑