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

Bar*_*ney 1 javascript parsing destructuring ecmascript-6

使用数组解构,可以通过插入逗号而不使用前面的引用来丢弃前导项:

const [ , two ] = [ 1, 2 ]
Run Code Online (Sandbox Code Playgroud)

函数签名也是如此 - 以下代码不会解析,因为签名中的前导逗号是意外的:

function ditchFirstArgument( , second ){}
Run Code Online (Sandbox Code Playgroud)

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

小智 5

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

因为否则会出现语法错误.不仅仅是ES6,而且任何版本的语言都不能忽略正式参数,因为规范没有规定它.

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

function ditchFirstArgument(...[, second]) {}
Run Code Online (Sandbox Code Playgroud)

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

function ditchFirstArgument(...args) {
  const [, second] = args;
Run Code Online (Sandbox Code Playgroud)

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

你不得不问那些写它的人,但他们可能从来没有考虑过它,或者他们是否这样做,拒绝它,因为它容易出错,几乎没有必要,并且可以很容易地使用虚假的形式参数来解决_.


Bar*_*ney 5

罗马的见解,其中令牌从围棋是有用的,但不恰当的JS_ 是一个有效的参考,通常使用的下划线,后来Lodash库。

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

但是,可以将函数参数解构空对象,这有效地使参数无效而无需引用。

function take_third( {}, {}, third ){
  return third 
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如保罗在评论中指出的那样,如果任何跳过的参数值为nullor ,这将抛出undefinedundefined可以使用默认分配来保护值,但这不适用于null

function take_third( {} = {}, {} = {}, third ){
  return third 
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果忽略的参数之一是“null”或“undefined”,您将收到异常。 (2认同)