2024-02-23 08:03:09
在 JavaScript 中,rest 参数是一种优雅处理可变参数的方式,通过在函数最后一个参数前添加 ...,将多余的参数打包成一个真数组,从而简化对不定数量输入的操作。以下是详细说明:

在函数定义中,使用 ... 标记最后一个参数,即可将其收集为数组:
function sumAll(...numbers) { let total = 0; for (const num of numbers) { total += num; } return total;}console.log(sumAll(1, 2, 3)); // 输出 6console.log(sumAll(10, 20, 30, 40, 50)); // 输出 150console.log(sumAll()); // 输出 0数据类型:
arguments 是类数组对象,需通过 Array.from(arguments) 或 [].slice.call(arguments) 转换为真数组。
Rest 参数直接生成真数组,开箱即用。
参数范围:
arguments 包含所有参数(包括命名参数),可能引发混淆。
Rest 参数仅收集未命名的剩余参数,逻辑更清晰。例如:function greet(name, ...messages) { console.log(name); // 明确命名参数 console.log(messages); // 仅收集剩余参数}
箭头函数支持:
箭头函数无 arguments 对象,Rest 参数是其唯一原生解决方案。
日志记录函数:
固定日志级别,动态收集多条消息:function log(level, ...messages) { const timestamp = new Date().toISOString(); console.log(`[${timestamp}] [${level.toUpperCase()}]:`, ...messages);}log('info', '用户', 'admin', '登录成功', 'IP:', '192.168.1.1');
事件处理器:
捕获动态事件参数,无需预设列表:function emitEvent(eventName, ...args) { console.log(`Event "${eventName}" triggered with arguments:`, args);}emitEvent('userLoggedIn', { userId: 123 }, new Date());

位置限制:
Rest 参数必须是最后一个参数,否则会报错:// 错误示例function invalidFunc(...args, lastParam) { /* SyntaxError */ }
数量限制:
一个函数只能有一个 Rest 参数,避免歧义:// 错误示例function anotherInvalidFunc(...first, ...second) { /* SyntaxError */ }
与展开运算符的区别:
Rest 参数(收集):用于函数定义,将参数打包为数组。function collect(...items) { console.log(items); } // [1, 2, 3]collect(1, 2, 3);
展开运算符(展开):用于函数调用或数据结构,将数组展开为独立元素。const arr = [1, 2, 3];console.log(...arr); // 输出 1 2 3const newArr = [0, ...arr, 4]; // [0, 1, 2, 3, 4]

掌握 Rest 参数后,可更灵活地编写通用函数,适应动态输入场景。