为什么我不能跳过函数签名中的参数分配?

Why can't I skip parameter assignments in a function signature?

通过数组解构,可以通过在没有前面引用的情况下插入逗号来丢弃前导项:

const [ , two ] = [ 1, 2 ]

函数签名并非如此——以下代码将无法解析,因为签名中的前导逗号是意外的:

function ditchFirstArgument( , second ){}

为什么我需要为 ES6 函数表达式中的前导参数提供引用?

我认为用下划线命名未使用的变量是一种常见的模式:

function ditchFirstArgument(_, second) { /* ... */ }

虽然它不会阻止您实际使用此变量(如 Go),但它似乎是一个非常简单的解决方法。

Why do I need to provide references for leading parameters in ES6 function expressions?

否则会出现语法错误。不仅在 ES6 中,而且在任何版本的语言中,你都不能省略形式参数,因为规范没有提供它。

如果你真的想这样做(但为什么?),你可以把它写成

function ditchFirstArgument(...[, second]) {}

或者至少你将能够在未来的某个 ES 版本中使用;参见 https://github.com/tc39/ecma262/commit/d322357e6be95bc4bd3e03f5944a736aac55fa50。这似乎已经在 Chrome 中得到支持。与此同时,你能做的最好的事情就是

function ditchFirstArgument(...args) {
  const [, second] = args;

But why does the spec not allow elision of parameters?

你不得不问写它的人,但他们可能从来没有考虑过,或者即使他们考虑过,也拒绝了它,因为它容易出错,几乎没有必要,而且可以很容易地解决使用虚拟形式参数,如 _.

from Go is useful but inappropriate to JS where the token _ is a valid reference, conventionally used by the Underscore and later Lodash 个库。

即使这是可以接受的,您也必须为每个未使用的参数创建并避免无用的引用,这并不理想。

但是,可以 destructure a function argument 变成一个 空对象 ,这会有效地使没有引用的参数无效。

function take_third( {}, {}, third ){
  return third 
}

编辑:正如 Paul 在评论中指出的那样,如果任何跳过的参数值是 nullundefined,这将抛出。 undefined 值可以通过默认赋值来防止,但这不适用于 null:

function take_third( {} = {}, {} = {}, third ){
  return third 
}