Подтвердить что ты не робот

С помощью оператора распространения несколько раз в 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 ]
4b9b3361

Ответ 1

Почему нельзя использовать оператор размножения несколько раз?

... не является оператором. (...arr) недействителен JavaScript. ... допускается только внутри литералов массива и в списках аргументов, но это специальные формы синтаксиса (обратите внимание на ... в приведенных ниже правилах производства).

ArrayLiteral

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

Ответ 2

Потому что... arr не похож на функцию, возвращающую значение в обычных сценариях (вы можете проверить это, просто набрав... [[1,2,3]] в консоли, если... работать как нормальную функцию, мы ожидаем возврат [1 2 3]. По этой причине вы не можете связывать спреды. Из MDN:

Оператор спрединга позволяет расширять выражение в местах где несколько аргументов (для вызовов функций) или нескольких элементов (для литералов массива).

Ergo, распространение должно происходить внутри литералов массива, литералов объектов (если используется obj spread, это ES7) или внутри вызовов функций Итак, вы можете сделать console.log(... []. Concat (... arr))

Ответ 3

В соответствии с этим, вход с расширенным синтаксисом является итеративным (например, массивом), но его выходной результат не является итеративным (например, не массивом). Таким образом, проблема заключается в том, что во внешнем синтаксисе распространения ... качестве входных данных вы помещаете не повторяемую вещь (...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));