[回归基础]JavaScript 函数中的参数:Parameters(形参) 和 Arguments(实参)

10年服务1亿Tian开发工程师

Parameters(形参) 和 Arguments(实参) 一样吗?

Javascript是一种函数式语言,这意味着函数是主要的执行模块单元。显然,JavaScript中的函数非常重要。当讨论函数时,术语 parameters(形式参数,简称形参) 和 arguments(实际参数,简称实参) 通常可以混用,就好像它们是一样的,但其实有一个非常微妙的区别。

  • Parameters(形参) 是函数定义时的形式参数,作为函数定义的一部分,是列出类的变量。
  • Arguments(实参) 是函数调用时的实际参数,是在函数被调用时传递给该函数的变量值。

我们为什么要为这个微小的差异而烦恼呢?

首先,如果函数调用期间传递的 arguments(实参) 数量和函数定义中列出的 parameters(形参) 数量不同,JavaScript 不会抛出错误。我们应该清楚的是, parameters(形参) 和 arguments(实参) 应该被视为两个不同的实体来对待。

// 带有3个parameters(形参)的基本函数,打印所有参数的和
function argCheck(paramter1, parameter2, parameter3){
  console.log(parameter1 + parameter2 + parameter3);
}

// 多 1 个 arguments(实参) 调用
argCheck(1,2,3,4);
// 打印 6 (1 + 2 + 3, 忽略 4)

// 少 1 个 arguments(实参) 调用
argCheck(1,2);
// 打印 NaN ,因为默认情况下,如果缺少相应的 arguments(实参) ,那么它将被设置为 undefined 。
// parameter3 被分配为 undefined ,所以 1+2+undefined = NaN

// 特别注意,这里不会抛出错误

在上面的代码片段中,函数 argCheck 根据其函数定义获取三个参数。在第7行中,我们使用 1 个额外的 arguments(实参) 调用函数,代码执行时没有抛出任何错误。类似地,在第11行中,我们用比 parameters(形参) 少一个的 arguments(实参) 调用函数,它仍然不会引发任何错误。希望这已经使你确信,arguments(实参) 和 parameters(形参) 还有更多的内容,本文将讨论 JavaScript 在上下文环境中提供的一些特性。

基本上,当提供多余 arguments(实参) 时,它们不会被分配给任何 parameters(形参)。有一些方法可以访问这些多余的分配,我们将会在后面稍微的讲一下。另一方面,如果我们的 parameters(形参) 比 arguments(实参) 多,没有相应 arguments(实参) 的 parameters(形参) 将被设置为 undefined 。让我们逐个探究一下与 arguments(实参) 和 parameters(形参) 相关的一些 JS 特性。

arguments 形参

不,这不是打字错误。 arguments 形参基本上是传递给函数的所有参数的集合。该参数隐式地传递,就像 this 形参一样。arguments 形参是一个类似数组的构造,即使没有显式定义的 parameters(形参) ,它也可以用于访问传递给函数的 arguments(实参)。

function argumentVar(parameter1, parameter2, parameter3){
  console.log(arguments.length); // 打印传递的 arguments(实参) 数量。
  console.log(arguments[3]); // 打印第4个 arguments(实参) 。遵循数组索引计数 
}

argumentVar(1,2,3,4,5);
// 顺序打印结果
// 5
// 4

// 5 是 arguments(实参) 的数量
// 4 是第 4 个 arguments(实参)

请参阅上面使用 arguments 形参的代码片段。 arguments.length 表示 arguments(实参) 的确切数量,这并不取决于函数定义中 parameters(形参) 的数量。可以使用类似于数组的索引计数来访问各个参数。

arguments 对象的一个有趣的特性是它在非严格模式下将函数 parameters(形参) 设为别名。 这意味着更改 arguments[0] 会更改 parameter1

Rest Parameters(剩余形参)

Rest 剩余形参是 ES6 添加到 JavaScript 的一个新特性。函数定义时,在最后一个形参前添加省略号(…)前缀。

function restParam(...restArgs){
  console.log(restArgs.length); // 打印传递的 arguments(实参) 数量。
  console.log(restArgs[3]); // 打印第4个 arguments(实参)
}

restParam(1,2,3,4,5);
// 顺序打印结果
// 5
// 4

// 5 是 arguments(实参) 的数量
// 4 是第 4 个 arguments(实参)

在上面的代码片段中,…restArgs 创建一个数组 restArgs ,它会在这个数组中保存传递给函数的所有 arguments(实参) 。Rest Parameters (剩余形参) 必须是最后一个 parameters(形参) ,否则会引发语法错误:Syntax error : parameter after rest parameter

arguments 对象和 rest parameters (剩余形参)之间有两个主要区别:

  • Rest Parameters(剩余形参) 是一个真正的数组,可以应用 forEachsort 等数组方法。尽管 arguments 对象有 length 方法,但它不是一个真正的数组,不能使用 sort 这样的数组方法。
  • Rest Parameters(剩余形参) 只包含没有相应形参的实参,而 arguments 对象包含传递给函数的所有参数。 代码段 #3 也可以写成如下形式:
function restParam(parameter1, ...restArgs){
  console.log(restArgs.length); // 打印没有相应 Parameters(形参)的 Arguments(实参)数量
  console.log(restArgs[2]); // 打印没有相应 Parameters(形参)的第三个 Arguments(实参)
}

restParam(1,2,3,4,5);
// 顺序打印结果
// 4
// 4

// 4 是没有相应 Parameters(形参)的 Arguments(实参)数量
// 4 没有相应 Parameters(形参)的第三个 Arguments(实参)值

希望本文有助于你了解有关 Arguments(实参) 和 Parameters(形参) 的一些信息,以及为什么要区分两者的重要性。如果您有任何问题或希望我详细说明,请留言。

赞(1) 打赏
未经允许不得转载:WEBTian开发 » [回归基础]JavaScript 函数中的参数:Parameters(形参) 和 Arguments(实参)

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #-49

    一直不知道javascript的实参形参还有这种操作的

    Yukino Miko1年前 (2017-08-30)回复

Tian开发相关广告投放 更专业 更精准

联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏