使用数组解构,可以在没有前置引用的情况下通过插入逗号来丢弃前导项:
const [ , two ] = [ 1, 2 ]
同样的情况不适用于函数签名 —— 以下代码无法解析,因为签名中的逗号是意外的:
function ditchFirstArgument( , second ){}
为什么在ES6函数表达式中需要提供引用参数?
使用数组解构,可以在没有前置引用的情况下通过插入逗号来丢弃前导项:
const [ , two ] = [ 1, 2 ]
同样的情况不适用于函数签名 —— 以下代码无法解析,因为签名中的逗号是意外的:
function ditchFirstArgument( , second ){}
为什么在ES6函数表达式中需要提供引用参数?
因为否则它将成为语法错误。不仅在ES6中,在任何版本的语言中都不能省略形式参数,因为规范没有提供这样的方式。
如果你真的想这样做(但为什么呢?),你可以这样写:
function ditchFirstArgument(...[, second]) {}
至少在ES的某个未来版本中,您将能够使用此功能;请参见https://github.com/tc39/ecma262/commit/d322357e6be95bc4bd3e03f5944a736aac55fa50。目前似乎已在Chrome中支持此功能。与此同时,您所能做的最好的事情是:
function ditchFirstArgument(...args) {
const [, second] = args;
但为什么规范不允许省略参数呢?
你得问那些写规范的人,但他们可能从未考虑过这一点,或者如果他们考虑过,就会拒绝它,因为它容易出现错误,几乎从不必要,并且可以使用类似于_
的虚拟形式参数轻松解决。
__
(两个下划线)来避免它覆盖全局_
(单个下划线)变量。 - SukimaGo语言中的Roman's insight非常有用,但在JS中不适用,因为标记_
是一个有效的引用,通常由Underscore和后来的Lodash库使用。
即使这是可以接受的,在每个未使用的参数上创建并避免虚假参考也不是理想的。
然而,可以将函数参数解构为一个空对象,这将有效地使参数无效且没有引用。
function take_third( {}, {}, third ){
return third
}
编辑:正如Paul在评论中指出的那样,如果任何跳过的参数值为null
或undefined
,则会抛出异常。可以通过默认赋值来防止undefined
值,但这对于null
不起作用:
function take_third( {} = {}, {} = {}, third ){
return third
}
null
或 undefined
,您将会收到一个异常。 - Paul{} = {}
对可空值并不能解决@Paul的评论。 - TruMan1我相信给未使用的变量命名下划线是一种常见的模式:
function ditchFirstArgument(_, second) { /* ... */ }
虽然这不会阻止您实际使用该变量(例如在Go中),但它似乎是一个相当直接的解决方法。
function tasks(_parent, _args, ctx, info) { ... }
。还有一个 eslint 规则可以实现这个功能。 - Роман Парадеев