Software Engineer · 语言与工程基础

JavaScript rest parameter:数组收集与 spread 的方向

解释 rest 参数、默认参数与 arguments,区分展开语法。

题目重点:解释 rest 参数、默认参数与 arguments,区分展开语法。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 讨论函数参数位置的 rest;它必须是最后一个形参,收集的是剩余实参。

解题路线

  1. function f(first,...rest) 中 rest 是真正数组,可用 map/filter,first 不包含在 rest;没剩余时为空数组。
  2. arguments 是普通函数的类数组对象,包含全部实参;箭头函数没有自己的 arguments。严格模式等条件影响旧式形参与 arguments 的别名语义,优先显式参数。
  3. rest 收集调用输入;调用处 spread 把可迭代对象展开为独立实参。相同三点符号在两侧方向相反。
  4. 默认参数在对应输入 undefined 时生效;null 不触发默认。rest 本身不能再加默认值。

手动走一遍

f("tag",1,2) 得 first="tag"、rest=[1,2];f("tag") 的 rest=[]。sum(...[1,2,3]) 是展开;function sum(...xs) 是收集。箭头回调应直接声明 ...xs,不借外层 arguments。

规模与取舍

收集 n 个剩余参数需要 O(n) 数组空间;超大列表展开为实参可能触发运行时参数数量限制。

易错点与追问

容易失分的边界

  • rest 是 arguments 的别名。
  • rest 参数后还能写另一个参数。
  • null 和 undefined 默认行为相同。

继续深挖

  • 对象解构里的 rest 与函数 rest 有何区别?
  • 浅复制为什么仍共享嵌套对象?
✓已复制微信号!