扩展运算符(...)用于将可迭代对象展开为独立元素,替代apply()传参,支持数组、字符串、Set/Map、类数组等;需注意仅限实参位置使用,不可展开null/undefined,且不深拷贝、大数组可能栈溢出。

扩展运算符(...)在 JavaScript 中用于将可迭代对象(如数组、字符串、类数组对象)或对象“展开”成独立的元素,常用于函数调用时替代 apply() 传递参数。
用扩展运算符代替 apply() 传参
以前调用函数并传入数组中的每个元素作为参数,需用 Function.prototype.apply():
Math.max.apply(null, [1, 5, 3]); // 5
现在直接用扩展运算符更简洁直观:
新写法:Math.max(...[1, 5, 3]); // 5
它把数组里的每个值依次作为独立参数传入函数,等价于 Math.max(1, 5, 3)。
立即学习“Java免费学习笔记(深入)”;
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
支持多种可迭代数据类型
扩展运算符不仅适用于数组,还可用于其他可迭代对象:
- 字符串:每个字符被展开为单独参数
- Set / Map(键或值):需配合
Array.from()或解构获取可迭代部分 - 类数组对象(如
arguments、NodeList):需先转为真数组再展开,或直接用[...arrayLike]
例如:
function sum(a, b, c) { return a + b + c; }
sum(..."123"); // 1 + 2 + 3 = 6(字符串被拆成字符,自动转为数字)与剩余参数配合实现灵活函数签名
扩展运算符和剩余参数(... 在形参位置)是一对互补语法:
- 调用时用
...arr把数组“打散”传入 - 定义时用
function f(...args)把所有实参收集成数组
示例:
function multiplyBy(x, ...nums) {
return nums.map(n => n * x);
}
multiplyBy(2, ...[3, 4, 5]); // [6, 8, 10]注意事项与常见错误
使用时要注意几点:
- 只能出现在函数调用的**实参位置**,不能在表达式中间或赋值左侧单独使用
- 不能展开
null或undefined,会报错TypeError: Invalid attempt to spread non-iterable instance - 若数组含非原始值(如对象),展开后仍是引用,不深拷贝
- 性能上,超大数组展开可能触发栈溢出(V8 引擎限制),此时仍建议用
apply或循环

















