Spreizen undefiniert in Array vs Objekt

8

Warum gibt die undefinierte Verbreitung in einem Objekt ein leeres Objekt zurück? {...undefined} // equals {} :

%Vor%

Und warum gibt eine undefinierte Verteilung in einem Array einen Fehler? [...undefined] // type error :

%Vor%
    
Timur Ozkul 07.11.2017, 10:09
quelle

1 Antwort

9

Wie in den Kommentaren erwähnt und von @ftor aus # 687 zusammengefasst, entspricht die Objektverteilung < a href="https://www.ecma-international.org/ecma-262/6.0/index.html#sec-object.assign"> Object.assign () (Probleme # 687 , # 45 ), wobei sich der Array-Literal-Kontext iteriert verteilt.

Zitieren Ecma-262 6.0 , Object.assign () ist definiert als:

  

19.1.2.1 Object.assign (Ziel, ... Quellen)

     

Die Funktion zuweisen wird verwendet, um die Werte aller aufzählbaren eigenen Eigenschaften von einem oder mehreren Quellobjekten in ein Zielobjekt zu kopieren. Wenn die Funktion zuweisen aufgerufen wird, werden die folgenden Schritte ausgeführt:

     
  1. Lassen Sie ToObject (Ziel).
  2.   
  3. ReturnIfAbrupt (bis).
  4.   
  5. Wenn nur ein Argument übergeben wurde, kehren Sie zu
  6. zurück   
  7. Quellen sollten die Liste von Argumentwerten beginnend mit dem zweiten Argument.
  8.   
  9. Für jedes Element nextSource von Quellen, in aufsteigender Reihenfolge, tun      
    1. Wenn nextSource undefined oder null lautet, lassen Sie die Schlüssel leer sein Liste .
    2.   
    3. Else, ...
    4.   
  10.   

... gefolgt von der Beschreibung des Kopierens eigener Eigenschaften. Der Entwurf der Object Rest / Spread-Eigenschaften lautet hier . Es ist kein Teil der Ecma-262 6.0.

A SpreadElement in einem Array-Literalausdruck ist wie folgt definiert:

  

SpreadElement : ... Zuweisungsexpression

     
  1. Sei spreadRef das Ergebnis der Evaluierung von AssignmentExpression .
  2.   
  3. Lassen Sie spreadObj GetValue sein ( spreadRef ).
  4.   
  5. Lassen Sie iterator GetIterator sein ( spreadObj ).
  6.   
  7. ReturnIfAbrupt (Iterator).
  8.   

Und da undefined kein a Eigenschaft mit dem Schlüssel @@ iterator , ein < strong> TypeError wird basierend auf den Schritten von GetIterator ausgelöst. a>. Der Standard ist nicht leicht zu lesen, aber wenn ich mich nicht irre, ist der Pfad zum Fehler GetIterator - & gt; GetMethod - & gt; GetV - & gt; ToObject , das einen TypeError für undefined und null auslöst.

Ein einfaches Mittel zur Verwendung von Variablen mit möglicherweise nicht definiertem Wert bei der Array-Initialisierung ist die Verwendung eines Standards:

%Vor%     
Ilja Everilä 07.11.2017, 11:30
quelle