为什么 Babel 使用 `arguments` 对象作为可选参数?

Why is Babel using the `arguments` object for optional parameters?

关于可选参数,我注意到 babel 的一个有点奇怪的转译决定。以下 ES6 代码:

function myFunction(x = 2, y = 3) {}

被转译为

function myFunction() {
  var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 2;
  var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;
}

我很快就要举行一次关于 ES6 语法更短和更简洁的演示,以及它在 ES5 中的外观(通常通过 Babel)。但对我来说,这似乎有点强迫,而且性能也差得多。有什么理由不这样做吗?:

function myFunction(x, y) {
  x = x === undefined ? 2 : x;
  y = y === undefined ? 3 : y;
}

Are there reasons not to do this?

这会与规范冲突,规范说函数的元数(.length)是在第一个具有默认值的参数或其余参数之前声明的参数的数量。 (这个定义 starts here;遵循它是...有趣。但这就是它的归结所在。)

您的 myFunction 在第一个具有默认值的参数之前没有声明参数,因此具有 length == 0。如果按照您的建议进行转译,它会变成 length == 2,这将违反规范。