为什么babel会以这种方式转换默认参数?

时间:2018-05-17 15:56:56

标签: ecmascript-6 babeljs

Babel正在将ES2015的默认参数转换为ES5,但它似乎非常冗长。这是原始功能:

function initStyles(skipScaling = false) {/*...*/}

以下是转化后的结果:

function initStyles() {
  var skipScaling = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
}

如果我(可能天真地)实现这一点,我会做这样的事情:

function initStyles(skipScaling) {
  if (skipScaling === undefined) skipScaling = false;
}

Babel以这种方式处理它的原因是什么?

2 个答案:

答案 0 :(得分:5)

具有默认初始值设定项的参数不计入函数arity。 initStyles函数的.length应为0,Babel使用arguments object初始化var而非使用命名参数来复制该函数。< / p>

答案 1 :(得分:-1)

要在@Bergi所提到的内容中添加一些说明,该内容与“函数期望的参数数量” Function.prototype.length相关。

(过去是arity,现在已经过时了。)

在ES6环境中,

function foo(s = 123) { 
  console.log(arguments, s) 
}

console.log("foo.length", foo.length);

最后将打印出0

Babel或Traceur的翻译方式:

function foo() {
  var s = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 123;
  console.log(arguments, s);
}

console.log("foo.length", foo.length);

它还将在末尾打印出0

如果这样写:

function bar(s) {
  if (s === undefined) s = 123;
  console.log(arguments, s);
}

console.log("bar.length", bar.length);

然后它将在末尾打印出1,因此它与ES6并不完全相同。