2016-01-26 12 views
12

Dlaczego nie można używać operatora rozrzucania wiele razy?Korzystanie z operatora rozprzestrzeniania się wiele razy w 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 ')' 

spodziewałbym:

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

'... (ARR)' działa. jest taki sam jak "... arr" – madox2

+1

Zgodnie ze specyfikacją ES6, gdy napotkany jest operator rozprzestrzeniania, tworzony jest iterator z obiektu rozproszonego, który jest wynikiem oceny wyrażenia przypisania, które znajduje się w twoim przykładzie roboczym 'arr', np. '... arr'. Z 'console.log (... (... arr));' próbujesz przekazać operator rozprzestrzeniania + wyrażenie przypisania jako wyrażenie przypisania do innego operatora rozprzestrzeniania. Zobacz http://www.ecma-international.org/ecma-262/6.0/#sec-argument-lists – br3w5

+0

Możesz chcieć wypróbować 'console.log (... []. Concat (... arr)) '(lub jakakolwiek inna funkcja' spłaszczania') – Bergi

Odpowiedz

11

Dlaczego operator nie może być używany wielokrotnie?

... nie jest operatorem. (...arr) nie jest prawidłowym kodem JavaScript. ... jest dozwolone tylko wewnątrz literałów tablicy i na listach argumentów, ale są to specjalne formy składni (zwróć uwagę na ... w regułach produkcji poniżej).

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 
+0

Byłem przekonany, że rozprzestrzenianie już rozłożonej tablicy nie zostanie ocenione, ale okazuje się, że byłem w błędzie, ponieważ tak. To wydaje się być jedyną słuszną odpowiedzią. +1 – Trace

+1

Mówisz więc, że operator rozprzestrzeniania nie jest operatorem? – madox2

+1

@ madox2: Tak. Nie wiem, kto wymyślił termin "operator rozprzestrzeniania", ale z pewnością nie jest operatorem w rozumieniu JavaScript. To tylko żeton. –

0

... arr Ponieważ nie podoba funkcję zwracającą wartość w normalnych sytuacjach (można to sprawdzić poprzez wpisanie ... [[1 , 2,3]] w konsoli, jeśli ... działał jak normalna funkcja, spodziewalibyśmy się zwrotu [1 2 3], z tego powodu nie można rozprowadzać spreadów. Od MDN:

operator rozprzestrzeniania pozwala na rozszerzenie wyrażenia w miejscach gdzie mnożnik Argumenty (dla wywołań funkcji) lub wielu elementów (dla literałów tablicowych) są oczekiwane.

Ergo spready muszą nastąpić w ciągu literałów Array literały obiektowe (w przypadku korzystania rozprzestrzenianiu obj, która jest ES7) albo w wywołań funkcji Więc można zrobić console.log (... []. Concat (. ..arr))

Powiązane problemy