拓展运算符和剩余参数

在JavaScript中,扩展运算符(...)和剩余参数(也是用 ... 表示)是紧密相关但用途不同的两个概念。以下为你详细解析,方便面试作答:

1. 扩展运算符

  • 定义与外观 :扩展运算符(...)用于在函数调用、数组字面量或对象字面量中展开数组或对象的元素或属性。
  • 在数组中的应用
    • 数组展开 :将数组展开成独立元素,常用于函数调用场景。例如,Math.min() 函数接收多个数字参数并返回最小值,若已有数字数组,可借助扩展运算符实现功能。
javascript 复制代码
let numbers = [3, 5, 1];
let minNumber = Math.min(...numbers);
console.log(minNumber); 

这里 ...numbers 将数组 numbers 展开为 3, 5, 1,作为 Math.min() 的参数,如同直接传递这些数字。 - 数组合并:简洁地合并多个数组。

javascript 复制代码
let arr1 = [1, 2];
let arr2 = [3, 4];
let combinedArray = [...arr1, ...arr2];
console.log(combinedArray); 

通过 ...arr1...arr2,将两个数组合并为 [1, 2, 3, 4],相比 concat() 方法,代码更简洁,合并多个数组时优势明显。 - 数组复制:实现数组浅拷贝。

javascript 复制代码
let originalArray = [1, 2, 3];
let copiedArray = [...originalArray];
console.log(copiedArray); 

copiedArrayoriginalArray 的浅拷贝,两个数组内容相同但内存独立,修改其中一个不影响另一个。

  • 在对象中的应用
    • 对象展开:在对象字面量中展开对象的可枚举属性。
javascript 复制代码
let obj1 = { a: 1, b: 2 };
let obj2 = { ...obj1, c: 3 };
console.log(obj2); 

...obj1obj1 的属性 ab 展开到 obj2 中,再添加新属性 c,最终 obj2{ a: 1, b: 2, c: 3 }。 - 对象合并:合并多个对象。

javascript 复制代码
let objA = { x: 10 };
let objB = { y: 20 };
let mergedObj = { ...objA, ...objB };
console.log(mergedObj); 

mergedObj 合并了 objAobjB 的属性,若有相同属性名,后面对象的属性会覆盖前面对象的属性。

2. 剩余参数

  • 定义与外观 :剩余参数(...)用于在函数定义中收集多余的参数到一个数组中。
  • 应用场景
    • 处理不定数量参数:在函数定义时,不确定会传入多少参数的情况下非常有用。例如实现一个求和函数,可处理任意数量参数。
javascript 复制代码
function sum(...nums) {
    return nums.reduce((acc, num) => acc + num, 0);
}
let result = sum(1, 2, 3);
console.log(result); 

这里 ...nums 收集了所有传递给 sum() 函数的参数,无论参数个数,都能方便处理。与 arguments 对象相比,剩余参数是真正的数组,具备数组的方法,使用更便捷直观。 - 函数参数解构:在函数参数解构时,剩余参数可收集未匹配的参数。

javascript 复制代码
function showArgs([a, b,...rest]) {
    console.log(a); 
    console.log(b); 
    console.log(rest); 
}
showArgs([1, 2, 3, 4]); 

在这个例子中,a 匹配数组第一个元素 1b 匹配第二个元素 2...rest 收集剩余元素 [3, 4]

3. 两者区别

  • 使用位置:扩展运算符用于函数调用、数组字面量和对象字面量中,展开数组或对象;剩余参数仅用于函数定义的参数列表中,收集多余参数。
  • 功能侧重:扩展运算符主要是将已有数据结构展开,方便操作;剩余参数则专注于收集函数调用时传入的多余参数,便于在函数内统一处理。
相关推荐
程序员黑豆1 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
To_OC1 小时前
踩了个 TS 的坑之后,我终于把 type 和 interface 掰明白了
前端·react.js·typescript
GreenTea2 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
浮生望2 小时前
前端API工程化:用 Mock 数据与 Axios 配置实现独立于后端的并行开发
前端
万少2 小时前
给 DeepSeek Harness 装个"应用商店":一条命令,595 个插件随你逛
前端·javascript·后端
波波0073 小时前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流
服务器·前端·c#
Brown.alexis3 小时前
es6知识点1-自备使用
前端·ecmascript·es6
小爬的老粉丝4 小时前
JavaScript 纯前端预览 WPS:先识别容器,再路由解析器
前端·javascript·wps
计算机魔术师5 小时前
新兴多智能体系统的模式与问题
前端
用户059540174465 小时前
AI Agent 上下文污染踩坑实录:用 pytest + Redis 揪出 3 类记忆串号 bug,排查 6 小时
前端·css