题目重点:解释 rest 参数、默认参数与 arguments,区分展开语法。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 讨论函数参数位置的 rest;它必须是最后一个形参,收集的是剩余实参。
解题路线
- function f(first,...rest) 中 rest 是真正数组,可用 map/filter,first 不包含在 rest;没剩余时为空数组。
- arguments 是普通函数的类数组对象,包含全部实参;箭头函数没有自己的 arguments。严格模式等条件影响旧式形参与 arguments 的别名语义,优先显式参数。
- rest 收集调用输入;调用处 spread 把可迭代对象展开为独立实参。相同三点符号在两侧方向相反。
- 默认参数在对应输入 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 有何区别?
- 浅复制为什么仍共享嵌套对象?
