21

スプレッド演算子を複数回使用できないのはなぜですか?

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 ')'

私は期待します:

console.log(...(...arr)); // Array [ 1, 2, 3 ]
4

4 に答える 4

18

スプレッド演算子を複数回使用できないのはなぜですか?

...演算子ではありません。(...arr)は有効な JavaScript ではありません。...は配列リテラル内と引数リスト内でのみ許可されますが、これらは特殊な形式の構文です (...以下の生成規則の に注意してください)。

配列リテラル

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

ElementList :
  Elision_opt SpreadElement
  ElementList , Elision_opt SpreadElement

SpreadElement:
  ... AssignmentExpression

引数

Arguments :
  ( )
  ( ArgumentList )

ArgumentList :
  AssignmentExpression
  ... AssignmentExpression
  ArgumentList , AssignmentExpression
  ArgumentList , ... AssignmentExpression
于 2016-01-26T17:52:52.640 に答える
1

...arr は、通常のシナリオで値を返す関数とは異なるため (コンソールで ...[[1,2,3]] と入力するだけでこれをテストできます。 [1 2 3] のリターンが期待されます. そのため、スプレッドを連鎖させることはできません. MDN から:

スプレッド演算子を使用すると、複数の引数 (関数呼び出しの場合) または複数の要素 (配列リテラルの場合) が予想される場所で式を展開できます。

したがって、スプレッドは配列リテラル、オブジェクト リテラル (ES7 である obj スプレッドを使用する場合) または関数呼び出し内で発生する必要があります。

于 2016-01-26T17:45:49.697 に答える