为什么重新分配参数不适用于具有默认值的参数?

Hao*_* Wu 3 javascript

我有一个非常奇怪的问题,我不知道它是如何发生的。

当我用arguments[0] = 42. 在arguments[0]和第一个参数a都是42。这是预期的。

function foo(a, b, c) {
  arguments[0] = 42;
  console.log(a, arguments[0]);
}

foo(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用具有默认值的参数的函数时,第一个值a不再被重新分配。有人可以解释这种差异吗?

function foo(a, b, c = 3) {
  arguments[0] = 42;
  console.log(a, arguments[0]);
}

foo(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

Nic*_*ons 8

规范中有一条关于此的注释-arguments当您在函数声明中不使用 ES6+ 语法(或在严格模式下)时,您只会获得一个映射对象(重点是我的):

注意:映射参数对象仅提供给没有剩余参数、任何参数默认 值初始值设定项或任何解构参数的非严格函数

当您使用默认参数时,您的参数对象不会被映射,就像在严格模式下一样

function foo(a, b, c) {
  "use strict";
  arguments[0] = 42;
  console.log(a, arguments[0]);
}

foo(1, 2, 3); // 1 42
Run Code Online (Sandbox Code Playgroud)