在javascript中多次使用spread运算符?

mad*_*ox2 18 javascript ecmascript-6 spread-syntax

为什么不能多次使用传播运算符?

let arr = [[[1, 2, 3]]];

console.log(arr); // Array [ Array[1] ]
console.log(...arr); // Array [ Array[3] ]
console.log(...(...arr));
// SyntaxError: expected '=>' after argument list, got ')'
Run Code Online (Sandbox Code Playgroud)

我希望:

console.log(...(...arr)); // Array [ 1, 2, 3 ]
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 17

为什么不能多次使用传播运算符?

...不是运营商.(...arr)是无效的JavaScript....只允许在数组文字和参数列表中,但这些是语法的特殊形式(请注意...下面的生产规则).

ArrayLiteral

ArrayLiteral :
  [ Elision_opt ]
  [ ElementList ]
  [ ElementList , Elision_opt ]

ElementList :
  Elision_opt SpreadElement
  ElementList , Elision_opt SpreadElement

SpreadElement:
  ... AssignmentExpression
Run Code Online (Sandbox Code Playgroud)

参数

Arguments :
  ( )
  ( ArgumentList )

ArgumentList :
  AssignmentExpression
  ... AssignmentExpression
  ArgumentList , AssignmentExpression
  ArgumentList , ... AssignmentExpression
Run Code Online (Sandbox Code Playgroud)

  • @ madox2:如果我们将运算符视为一种特殊形式的函数(它在其他语言中),那么我们可以说我们可以在任何地方使用运算符,我们可以使用函数调用.例如,而不是`var foo = add(1,2);`我们可以写`var foo = 1 + 2;`.但是,我们不能用`var foo = ... arr;`替换`var foo = spread(arr);`.没有独立的扩展运算符,它只是数组初始值设定项和参数列表语法的扩展.在查看语言语法时,这一点就变得清晰了. (2认同)