为什么 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
,这将违反规范。
关于可选参数,我注意到 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
,这将违反规范。