2016-01-26 5 views
12

Warum kann der Operator nicht mehrfach verwendet werden?Verwendung von Spread-Operator mehrmals 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 ')' 

Ich würde erwarten:

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

'... (arr)' Werke. Es ist das gleiche wie "... arr" – madox2

+1

Gemäß der ES6-Spezifikation, wenn der Spread-Operator angetroffen wird, wird ein Iterator aus einem Spread-Objekt erstellt, das das Ergebnis der Auswertung des Zuweisungsausdrucks ist, der in Ihrem Arbeitsbeispiel "arr" ist. '... arr'. Mit 'console.log (... (... arr));' versuchen Sie, einen Spread-Operator + Zuweisungsausdruck als Zuweisungsausdruck an einen anderen Spread-Operator zu übergeben. Siehe http://www.ecma-international.org/ecma-262/6.0/#sec-argument-lists – br3w5

+0

Sie könnten versuchen, 'console.log (... []. Concat (... arr)) '(oder irgendeine andere' Flatten'-Funktion) – Bergi

Antwort

11

Warum kann der Operator nicht mehrfach verwendet werden?

... ist kein Operator. (...arr) ist kein gültiges JavaScript. ... ist nur in Array-Literalen und in Argumentenlisten erlaubt, aber das sind spezielle Formen der Syntax (beachten Sie die ... in den Produktionsregeln unten).

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

Ich war überzeugt, dass die Verbreitung eines bereits verteilten Arrays nicht ausgewertet werden würde, aber es stellt sich heraus, dass ich falsch lag, weil es so ist. Dies scheint die einzig richtige Antwort zu sein. +1 – Trace

+1

Sie sagen also, dass Spread-Operator kein Operator ist? – madox2

+1

@ madox2: Ja. Ich weiß nicht, wer den Begriff "Spread Operator" erfunden hat, aber es ist sicherlich kein Operator im Sinne von JavaScript. Es ist nur ein Zeichen. –

0

Weil ... arr keine Funktion ist nicht wie, die einen Wert in normalen Szenarien zurückgibt (Sie dies, indem nur die Eingabe testen ... [[1 , 2,3]] in der Konsole, wenn ... wie eine normale Funktion betrieben würden wir eine Rendite von [1 2 3] erwarten aus diesem Grund kann man nicht Kette breitet sich von MDN:..

Die Der Spread-Operator erlaubt es, einen Ausdruck an den Stellen wo multipl zu erweitern Es werden die Argumente (für Funktionsaufrufe) oder mehrere Elemente (für Array-Literale) erwartet.

Ergo, Aufstriche innerhalb Array Literale passieren müssen, Objektliterale (bei Verwendung von obj Spread, der ES7 ist) oder in Funktion aufruft So könnten Sie tun console.log (... []. Concat (. ..arr))

Verwandte Themen