【问题标题】:Why is Babel using the `arguments` object for optional parameters?为什么 Babel 使用 `arguments` 对象作为可选参数?
【发布时间】:2017-11-12 22:28:18
【问题描述】:

关于可选参数,我注意到 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;
}

【问题讨论】:

  • 是的。想象一个函数,您将在其中传递 undefined 作为参数。这就是需要长度检查的原因。
  • @JaredSmith:如果您将undefined 作为具有默认值的参数值传递,则使用默认值,而不是undefined
  • 对于您的演示,我不会将 ES2015 语法与 ES5 等效项在转译时的外观进行比较。相反,我会将 ES2015 语法与您在 ES5 中实际编写的语法进行比较,这看起来不太像 Babel 在许多情况下所做的(特别是看看它对 class 所做的)。就新语法的真正好处而言,这提供了更多信息。我想我们都同意,您上面的第一个代码块比您的上一个代码块更简洁(许多人也会认为更清晰,但这更主观)。
  • 你说得对,这主要是我的目标,但如果我要测试 babel 中的可选参数并且有人说“不,那不是真的,它可以用更短的方式编写”我现在会知道该说什么。
  • Babel 的目标不是简洁,而是符合规范。

标签: javascript ecmascript-6 babeljs transpiler


【解决方案1】:

有理由不这样做吗?

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

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

【讨论】:

    猜你喜欢
    • 2014-07-09
    • 2018-03-04
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    相关资源
    最近更新 更多