剩余参数是什么_如何操作不定数量的参数【教程】

发布时间 - 2026-01-30 00:00:00    点击率:
剩余参数(Rest Parameters)是JavaScript中用于捕获函数调用时多余实参的语法机制,本质是将不定数量参数收集成真正的Array实例,必须位于形参末尾且唯一,标识符如...args,区别于arguments对象,支持数组方法且在箭头函数中可用。

剩余参数(Rest Parameters)不是“可选参数”,也不是“默认参数”,它是 JavaScript 中专门用来捕获函数调用时**多余实参**的语法机制,本质是把不定数量的参数收集成一个真正的 Array 实例。

rest 参数必须写在形参列表末尾

它用三个点 ... 加一个标识符表示,比如 ...args。这个标识符会成为包含所有剩余实参的数组变量名。如果把它放在中间或开头,语法直接报错:

function bad(a, ...rest, b) { } // SyntaxError: Rest parameter must be last formal parameter
  • 只能有一个 rest 参数,且必须是最后一个形参
  • 它不占用“已命名参数”的位置 —— length 属性只统计非 rest 的形参数量
  • arguments 不同,...args 是真数组,能直接调用 .map().reduce() 等方法

和 arguments 对象的关键区别

arguments 是类数组对象,没有数组方法,且在箭头函数中不可用;rest 参数补上了这些短板:

  • arguments 在严格模式下无法修改 callee / caller,rest 参数无此限制
  • arguments 包含所有传入参数(包括已命名的),rest 参数只包含“多出来的”那部分
  • 箭头函数没有 arguments,但可以正常使用 rest 参数

例如:const sum = (...nums) => nums.reduce((a, b) => a + b, 0); —— 这比用 Array.from(a

rguments) 简洁安全得多。

常见误用:混淆 rest 和展开语法

... 在函数定义里是 rest(收集),在函数调用或字面量中是展开(spread)。写错位置就会出问题:

  • Math.max(...[1, 2, 3]) ✅ 正确:展开数组为独立参数
  • Math.max([1, 2, 3]) ❌ 返回 NaN:只传了一个数组参数
  • function f(...a, ...b) { } ❌ 语法错误:不允许多个 rest

注意:rest 参数不会自动“过滤 undefined”或跳过空槽位 —— 它忠实反映调用时传了什么,包括 undefinednull

实际场景中怎么安全处理?

多数时候你不需要手动遍历 args,而是结合解构或类型检查来提取关键参数:

  • 提取前几个固定参数,其余用 rest 收集:function log(level, message, ...meta) { console[level](message, ...meta); }
  • 配合默认值做兜底:function join(separator = ',', ...parts) { return parts.join(separator); }
  • 避免直接透传大量参数导致堆栈溢出:rest 参数本身不触发额外开销,但后续操作(如深拷贝)需留意

真正容易被忽略的是:rest 参数对 typeofinstanceof ArrayArray.isArray() 都返回 true,但它不是 arguments,也不受 caller 限制 —— 这些边界行为在调试和 polyfill 时会突然冒出来。


# javascript  # java  #   # 区别  # 堆栈溢出  # red  # Array  # NULL  # math  # 标识符  # const  #   # Length  # 形参  # 实参  # map  # console  # undefined  # function  # 对象  # typeof  # 严格模式  # 传了  # 的是  # 几个  # 就会  # 多个  # 上了  # 遍历  # 把它  # 你不  # 它是 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  Laravel如何使用.env文件管理环境变量?(最佳实践)  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  详解jQuery停止动画——stop()方法的使用  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  bing浏览器学术搜索入口_bing学术文献检索地址  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  JavaScript如何实现错误处理_try...catch如何捕获异常?  香港服务器如何优化才能显著提升网站加载速度?  网站建设保证美观性,需要考虑的几点问题!  浅谈redis在项目中的应用  Android中AutoCompleteTextView自动提示  如何快速登录WAP自助建站平台?  Laravel如何优化应用性能?(缓存和优化命令)  音响网站制作视频教程,隆霸音响官方网站?  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  nginx修改上传文件大小限制的方法  Android 常见的图片加载框架详细介绍  公司门户网站制作流程,华为官网怎么做?  如何用VPS主机快速搭建个人网站?  Laravel如何创建自定义Artisan命令?(代码示例)  重庆市网站制作公司,重庆招聘网站哪个好?  简单实现Android文件上传  北京企业网站设计制作公司,北京铁路集团官方网站?  JavaScript Ajax实现异步通信  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  Laravel如何处理和验证JSON类型的数据库字段  高防服务器:AI智能防御DDoS攻击与数据安全保障  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  免费网站制作appp,免费制作app哪个平台好?  Python自动化办公教程_ExcelWordPDF批量处理案例  如何快速搭建高效香港服务器网站?  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  Laravel如何使用Blade模板引擎?(完整语法和示例)  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  如何在阿里云域名上完成建站全流程?  如何在建站之星网店版论坛获取技术支持?  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  如何快速搭建虚拟主机网站?新手必看指南  Laravel如何生成API文档?(Swagger/OpenAPI教程)  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  Laravel怎么为数据库表字段添加索引以优化查询  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】