为什么可以't我跳过函数签名中的参数分配

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

本文关键字:函数 分配 参数 为什么      更新时间:2023-09-26

使用数组析构函数,可以通过插入没有前面引用的逗号来丢弃前导项:

const [ , two ] = [ 1, 2 ]

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

function ditchFirstArgument( , second ){}

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

Roman从Go中获得的见解很有用,但不适合JS,因为在JS中,令牌_是一个有效的引用,通常由Undercore和后来的Lodash库使用。

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

但是,可以将函数参数解构为空对象,这样可以有效地在没有引用的情况下使参数无效。

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

编辑:正如Paul在评论中指出的那样,如果任何跳过的参数值是nullundefined,就会抛出。undefined值可以通过默认分配进行保护,但这对null:不起作用

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

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

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

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

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

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

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

但是为什么规范不允许省略参数呢?

你必须询问编写它的人,但他们可能从未考虑过它,或者如果他们考虑过,就拒绝了它,因为它很容易出错,几乎没有必要,而且可以很容易地使用伪形式参数(如_)来解决问题。

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

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

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