JavaScript 函数参数个数

在 JavaScript 中,函数参数的个数是指在函数定义时声明的形式参数的数量。函数参数的个数对于函数的调用和使用非常重要,它决定了我们可以向函数传递多少个参数,并且还可以通过参数个数的判断来实现一些特定的功能。

函数参数的基本概念

函数是一种特殊的对象,它可以接受输入参数,并且执行一定的操作,然后返回一个结果。JavaScript 函数的参数可以分为两种类型:命名参数和剩余参数。

命名参数

命名参数是在函数定义时声明的具名参数。例如,下面的函数 add 接受两个命名参数 ab,并返回它们的和:

function add(a, b) {
  return a + b;
}

在调用函数时,我们可以向函数传递对应数量的参数:

add(1, 2); // 输出 3

如果我们传递的参数个数不符合函数定义的参数个数,JavaScript 不会报错,而是忽略多余的参数或者将缺少的参数赋值为 undefined

add(1, 2, 3, 4); // 输出 3,多余的参数被忽略
add(1); // 输出 NaN,缺少的参数赋值为 undefined

剩余参数

剩余参数(Rest Parameters)是一种特殊的语法,允许我们在函数定义时指定一个包含剩余参数的形式参数。剩余参数是以 ... 开头的形式参数,它可以接受任意数量的参数,并将它们作为一个数组传递给函数体。

下面的例子中,函数 sum 接受任意数量的参数,并返回它们的和:

function sum(...numbers) {
  return numbers.reduce((acc, curr) => acc + curr, 0);
}

在调用函数时,我们可以传递任意数量的参数:

sum(1, 2, 3); // 输出 6
sum(1, 2, 3, 4, 5); // 输出 15

函数参数个数的判断

JavaScript 中有多种方法可以判断函数的参数个数,下面介绍几种常见的方法。

arguments 对象

在函数内部,可以使用 arguments 对象来访问所有传递给函数的参数。arguments 对象是一个类数组对象,它类似于数组,但并不是一个真正的数组。它包含了函数所有的实际参数,并且可以通过索引来访问它们。

通过 arguments.length 属性可以获取函数实际传递的参数个数:

function foo(a, b) {
  console.log(arguments.length);
}

foo(1, 2); // 输出 2
foo(1, 2, 3, 4); // 输出 4

需要注意的是,arguments 对象只能在函数内部使用,并且在箭头函数中是不可用的。

函数的 length 属性

JavaScript 函数对象有一个 length 属性,该属性返回函数定义时声明的形式参数的个数。length 属性不包括剩余参数的个数,只包括命名参数的个数。

下面的例子中,函数 add 有两个命名参数,其 length 属性值为 2,不包括剩余参数 ...numbers

function add(a, b, ...numbers) {
  console.log(arguments.length);
  console.log(add.length);
}

add(1, 2, 3, 4); // 输出 4,2

默认参数

在 ECMAScript 6 (ES6) 中引入了默认参数的概念,允许我们在函数定义时为参数设置默认值。如果函数调用时没有传递对应的参数,则参数的值将是默认值。

使用默认参数的函数在判断参数个数时要注意,因为参数的默认值不会影响函数的 length 属性。例如,下面的函数 multiply 有一个默认参数 b

function multiply(a, b = 1) {
  console.log(arguments.length);
  console.log(multiply.length);
}

multiply(2);