为什么我不能在函数签名中跳过参数赋值?

6

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

const [ , two ] = [ 1, 2 ]

同样的情况不适用于函数签名 —— 以下代码无法解析,因为签名中的逗号是意外的:

function ditchFirstArgument( , second ){}

为什么在ES6函数表达式中需要提供引用参数?

4
您需要什么样的回答?“因为语言不允许”?如果您询问有关设计决策的原因,SO不是一个好地方(因为这里的大多数人没有在ECMAScript上工作)。 - Felix Kling
1
这将导致极度专业化的函数,可重用性极差。更糟糕的是:这些函数的命名将成为一个噩梦 :D - user5536315
Ivan,Estus,在编写可重用代码时,通常会公开符合公共接口的函数:这样程序员不需要了解函数的内部工作原理,但可以期望它遵循某个签名并根据预定义的期望范围返回输出。出于与解构赋值相同的原因,您可能希望以这种方式编写函数:在这种情况下,您不需要输入的某些部分。在这种情况下给它们引用只是误导性的噪音。 - Barney
@Barney 我不同意。从键入/索引对象中提取元素是一种常见操作。解构是一种语法上的便利,用于解决这个问题。提取参数以仅传递某些参数并不是参数的预期使用方式。这项工作应该通过更合适的方式在其他地方完成。由于您的问题基于观点,并且JavaScript是一种多范式语言,因此对此问题有不同的看法是可以的,我猜测。 - user5536315
1
为什么要定义一个带有被忽略参数的函数? - user663031
显示剩余4条评论
3个回答

5

为什么在ES6函数表达式中需要提供引用参数?

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

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

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

至少在ES的某个未来版本中,您将能够使用此功能;请参见https://github.com/tc39/ecma262/commit/d322357e6be95bc4bd3e03f5944a736aac55fa50。目前似乎已在Chrome中支持此功能。与此同时,您所能做的最好的事情是:

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

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

你得问那些写规范的人,但他们可能从未考虑过这一点,或者如果他们考虑过,就会拒绝它,因为它容易出现错误,几乎从不必要,并且可以使用类似于_的虚拟形式参数轻松解决。


1
一个警告是,如果你使用lodash或underscore,你可能想要使用__(两个下划线)来避免它覆盖全局_(单个下划线)变量。 - Sukima

5

Go语言中的Roman's insight非常有用,但在JS中不适用,因为标记_是一个有效的引用,通常由Underscore和后来的Lodash库使用。

即使这是可以接受的,在每个未使用的参数上创建并避免虚假参考也不是理想的。

然而,可以将函数参数解构为一个空对象,这将有效地使参数无效且没有引用。

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

编辑:正如Paul在评论中指出的那样,如果任何跳过的参数值为nullundefined,则会抛出异常。可以通过默认赋值来防止undefined值,但这对于null不起作用:

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

2
请注意,如果其中一个被忽略的参数为 nullundefined,您将会收到一个异常。 - Paul
不幸的是,{} = {} 对可空值并不能解决@Paul的评论。 - TruMan1

3

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

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

虽然这不会阻止您实际使用该变量(例如在Go中),但它似乎是一个相当直接的解决方法。


1
第三个参数的约定是什么?dta(_,_,third){ / * ... /*}会抛出错误。 - Vitali Bichov
一种方法是在未使用的参数前加下划线:function tasks(_parent, _args, ctx, info) { ... }。还有一个 eslint 规则可以实现这个功能。 - Роман Парадеев

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接