在 javascript 中多次使用扩展运算符?

Using spread operator multiple times in javascript?

为什么展开运算符不能多次使用?

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 ]

因为 ...arr 不像在正常情况下 return 是一个值的函数(您可以通过在控制台中键入 ...[[1,2,3]] 来测试它,如果 ... 像正常函数一样运行,我们期望 return 为 [1 2 3]。因此你不能链式传播。来自 MDN:

The spread operator allows an expression to be expanded in places where multiple arguments (for function calls) or multiple elements (for array literals) are expected.

因此,传播需要发生在数组文字、对象文字(如果使用 obj 传播,即 ES7)或函数调用中 所以你可以做 console.log(...[].concat(...arr))

Why can't spread operator be used multiple times?

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

ArrayLiteral

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

ElementList :
  Elision_opt SpreadElement
  ElementList , Elision_opt SpreadElement

SpreadElement:
  ... AssignmentExpression

Arguments

Arguments :
  ( )
  ( ArgumentList )

ArgumentList :
  AssignmentExpression
  ... AssignmentExpression
  ArgumentList , AssignmentExpression
  ArgumentList , ... AssignmentExpression

根据this,扩展语法输入是可迭代的(例如数组),但它产生的输出是不可迭代的(例如非数组)。所以问题在于,在外部传播语法 ... 作为输入时,你放置了不可迭代的东西 (...arr),这会导致 SyntaxError。要使数组变平,您可以使用 flat(如果将 Infinity 改为 2,那么您将变平任何嵌套数组)

arr.flat(2)

let arr = [[[1, 2, 3]]];
console.log(arr.flat(2));

let arr2 = [[1,2,[3,4,[5,[6]]]], [[7,[8]],9]];;
console.log(arr2.flat(Infinity));

不回答你的问题,但是-一般来说,三点 ...语法可以 应用于可迭代对象 - 数组类数组对象.

Why can't spread operator be used multiple times?

我不会回答为什么的问题。
但是下面的代码片段显示 ...[].concat(...arr) 实现了您的目标 预计通过 ...(...arr) 获得。 它的灵感来自 .

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

console.log(JSON.stringify(arr));                  // [[[1,2,3]]]
console.log(JSON.stringify(...arr));               // [[1,2,3]]
// console.log(JSON.stringify(...(...arr)));       // SyntaxError: expect...
console.log(JSON.stringify(...[].concat(...arr))); // [1,2,3]
console.log(...[].concat(...[].concat(...arr)));   // 1 2 3
.as-console-wrapper { max-height: 100% !important; top: 0; }