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以这种方式处理它的原因是什么?
答案 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并不完全相同。