标准答案
- arguments 是普通函数内部的类数组对象,保存调用时实际传入的参数。它不是数组,箭头函数也没有自己的 arguments。
- 剩余参数 ...args 出现在函数形参位置,会把剩余实参收集成真正数组。现代代码通常优先用剩余参数,因为语义清楚,也能直接使用数组方法。
- 默认参数只在传入 undefined 或没有传参时生效,传入 null 不会触发默认值。
- 函数 length 表示第一个有默认值参数之前的形参数量,不包含剩余参数。手写 curry、参数校验或适配器时如果依赖 fn.length,要注意默认参数和剩余参数会改变这个值。
题目解析
arguments 反映的是调用时实参,形参列表反映的是函数声明。两者不是一回事,尤其在参数个数不固定时更要区分。
非严格模式下,简单参数列表里的 arguments 可能和形参存在映射关系;严格模式下这种行为更可预测。现代代码不建议依赖这种历史行为。
fn.length 是元信息,不是运行时传入参数数量。调用时传了几个参数要看 arguments.length 或剩余参数数组长度。
代码示例
下面示例展示 arguments、剩余参数、默认参数和 length 的差异。
JavaScript
function legacy(a, b) {
console.log(arguments.length)
return Array.from(arguments)
}
const modern = (...args) => args.map(String)
function demo(a, b = 1, c, ...rest) {
return { a, b, c, rest }
}
legacy(1, 2, 3) // [1, 2, 3]
modern(1, 2, 3) // ['1', '2', '3']
demo.length // 1
demo(10, undefined, 30, 40) // { a: 10, b: 1, c: 30, rest: [40] }常见误区
- 在箭头函数里使用 arguments。
- 误以为函数 length 等于调用时传入的参数数量。
- 默认参数只在参数为 undefined 时生效,不会在 null 时生效。