标准答案

  1. arguments 是普通函数内部的类数组对象,保存调用时实际传入的参数。它不是数组,箭头函数也没有自己的 arguments。
  2. 剩余参数 ...args 出现在函数形参位置,会把剩余实参收集成真正数组。现代代码通常优先用剩余参数,因为语义清楚,也能直接使用数组方法。
  3. 默认参数只在传入 undefined 或没有传参时生效,传入 null 不会触发默认值。
  4. 函数 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 时生效。

作者信息