2016-01-26 5 views
12

Perché l'operatore di diffusione non può essere utilizzato più volte?Utilizzo dell'operatore di diffusione più volte 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 ')' 

mi aspetterei:

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

'... (arr)' opere. è lo stesso di '... arr' – madox2

+1

Secondo la specifica ES6 quando si incontra l'operatore di spread viene creato un iteratore da un oggetto spread che è il risultato della valutazione dell'espressione di assegnazione che è nell'esempio di lavoro' arr' e.g. '... arr'. Con 'console.log (... (... arr));' stai tentando di passare un operatore di spread + un'espressione di assegnazione come espressione di assegnazione a un altro operatore di spread. Vedi http://www.ecma-international.org/ecma-262/6.0/#sec-argument-lists – br3w5

+0

Si potrebbe voler provare 'console.log (... []. Concat (... arr)) '(o qualsiasi altra funzione di appiattimento) – Bergi

risposta

11

Perché l'operatore di diffusione non può essere utilizzato più volte?

... non è un operatore. (...arr) non è valido JavaScript. ... è consentito solo all'interno di letterali di array e in elenchi di argomenti, ma quelli sono forme speciali della sintassi (notare lo ... nelle regole di produzione di seguito).

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

Ero convinto che la diffusione di un array già distribuito non sarebbe stata valutata, ma risulta che ho sbagliato, perché lo è. Questa sembra essere l'unica risposta giusta. +1 – Trace

+1

Quindi stai dicendo che l'operatore di spread non è un operatore? – madox2

+1

@ madox2: Sì. Non so chi ha inventato il termine "operatore di spread", ma non è certamente un operatore in senso JavaScript. È solo un segno. –

0

Perché ... arr non è come una funzione che restituisce un valore in scenari normali (si può verificare questo semplicemente digitando ... [[1 , 2,3]] in console, se ... funzionasse come una normale funzione ci aspetteremmo un ritorno di [1 2 3] .Per questo motivo non è possibile fare spreads a catena.Dal MDN:

operatore di spread consente di espandere un'espressione nei punti dove multiplo Sono previsti argomenti (per chiamate di funzioni) o più elementi (per valori letterali di array).

Ergo, gli spread hanno bisogno avvenire entro letterali di array, letterali oggetto (se si utilizza la diffusione obj, che è ES7) o all'interno di chiamate di funzione Così si potrebbe fare console.log (... []. Concat (. ..arr))