Warum tut {. . . .0} bewerten zu {}?


80

Ich habe gerade {....0}im Code eines Freundes gefunden . Die Auswertung in der Konsole gibt zurück {}(leeres Objekt).

Warum das? Was bedeuten 4 Punkte in JavaScript?


11
Fast 2500 mal in 6 Stunden gesehen? Es scheint, dass Ihr Freund den Spread-Operator in einem anderen Kontext verwendet.
Jeremy Harris

Dies ist eher eine Frage, wie dieser Ausdruck analysiert wird. Geben Sie dies in die JS-Konsole ein und Sie werden feststellen, dass der 4. Punkt anders gefärbt ist ... dieselbe Farbe wie Null.
Salman A


@ JeremyHarris die Magie von HNQ
Pac0

Antworten:


90

Vier Punkte haben eigentlich keine Bedeutung. ...ist der Spread-Operator und .0steht für 0.0.

Das Verteilen von 0 (oder einer beliebigen Zahl) in ein Objekt ergibt daher ein leeres Objekt {}.


9
Spreading 0 (or any number) yields an empty objectNicht unbedingt, wenn Sie eine Zahl an einer anderen Stelle als einem Objekt verteilen, wird ein Fehler ausgegeben, z. B. [... 0] wird ein Fehler ausgegeben.
Hitesh Kumar

2
@HiteshKumar Das Verbreiten nicht iterierbarer Objekte innerhalb eines Arrays löst zwar einen Fehler aus, hat aber nichts mit dieser Frage zu tun. Ich beziehe mich auf die erwähnte Objektverteilung. :)
NikxDa

2
NikxDa Ich denke, dass @HiteshKumar einen wichtigen Punkt gemacht hat. Es ist besser, expliziter auf Fälle einzugehen, in denen Ihre Aussagen zutreffen. Spreading 0 (or any number) in object literal yields an empty objectEnthält weitere nützliche Informationen ..
Mist

1
@Mist Ich habe die Antwort aktualisiert. Ich denke nicht, dass es gebraucht wird, aber es könnte gut zur Klärung sein. Danke für das Update!
NikxDa

1
@ NikxDa danke. Ich denke gerne, dass solche Aussagen „vollständiger“ sind, wenn Sie die Möglichkeit haben, sie aus dem Kontext herauszuschneiden, an anderer Stelle einzufügen und sie dennoch alle Informationen enthalten und lehrreich und informativ sind.
Nebel

56

Drei Punkte in einem Objektliteral sind eine Ausbreitungseigenschaft , z.

  const a = { b: 1, c: 1 };
  const d = { ...a, e: 1 }; // { b: 1, c: 1, e: 1 }

Der letzte Punkt mit einer 0 ist ein Zahlenliteral, .0das mit identisch ist 0.0. Deshalb dies:

 { ...(0.0) }

verteilt alle Eigenschaften des Zahlenobjekts auf das Objekt. Da Zahlen jedoch keine (eigenen) Eigenschaften haben, erhalten Sie ein leeres Objekt zurück.


Sie führen mich zum Nachdenken - ich kann jede Variable verbreiten, und eigene Schlüssel werden in das neue Objekt verteilt? Es funktioniert für Function (function x() {}), (x.k = 'v'), ({...x})// {k: 'v'}, aber nicht fürNumber (x = 10), (x.k = 'v'), ({...x}) // {}
Mist

3
@mist, weil Zahlen (und andere Grundelemente) in Objekte "eingepackt" werden, wenn Sie mit ihnen als Objekte arbeiten, und direkt danach "ausgepackt" werden. Daher x.kwird verloren gehen.
Jonas Wilms

Was bedeutet "Boxed" genau? Als ich beispielsweise den Punktoperator (Eigenschaft) verwendete, arbeitete ich mit der Zahl als Objekt. Wenn ich richtig liege, ist das nur ein Fall. Gibt es andere Fälle, in denen "Boxen" stattfindet? Gilt das nur für Zahlen? Gibt es einen perfekten Grund oder so? Ich denke, das ist eine andere Frage, und ich sollte sie weiter studieren. Könnten Sie mich auf ein Buch verweisen oder so?
Nebel

1
Vielen Dank! Ich verstehe, warum mein Schlüssel für die Nummer nicht funktionieren konnte. Yayy Boxen!
Mist

3
Zahlen haben keine eigenen aufzählbaren Eigenschaften. Aber sie haben Eigenschaften.
Patrick Roberts

6

In einfachen Worten erweitert der {...}Spread-Operator in Javascript ein Objekt / Array um ein anderes.

Wenn der Babelifier versucht, sich gegenseitig zu erweitern, muss er feststellen, ob er versucht, ein Array oder ein Objekt zu erweitern.

Im Fall von arrayiteriert es über Elemente.

Im Fall von objectiteriert es über Schlüssel.

In diesem Szenario versucht der Babelyfier, Schlüssel zu extrahieren, numberindem er die own property callfehlenden Objekte überprüft, numberdamit ein leeres Objekt zurückgegeben wird.


0

Mit dem Spread-Operator {...}können iterables erweitert werden. Dies bedeutet, dass die Datentypen, die in Form von key-valuePaaren definiert werden können, erweitert werden können. In Bezug auf Objectnennen wir Schlüssel-Wert-Paar als Objekteigenschaft und seinen Wert, während arrayswir in Bezug auf Index als Schlüssel und Element im Array als seinen Wert denken können.

let obj = { a: 4, b: 1};
let obj2 = { ...obj, c: 2, d: 4}; // {a: 4, b: 1, c: 2, d: 4}

let arr1 = ['1', '2'];
let obj3 = { ...arr1, ...['3']}; // {0: "3", 1: "2"}

In Bezug auf das Array ersetzt es hier das Element '1' von arr1durch '3', da beide den gleichen Index in unterschiedlichen Arrays haben.

Bei zu breiten Zeichenfolgen gibt der Operator ein nicht leeres Objekt zurück. Da Zeichenfolge ein Zeichenarray ist, wird Zeichenfolge als Array behandelt.

let obj4 = {...'hi',...'hello'}   // {0: "h", 1: "e", 2: "l", 3: "l", 4: "o"}
let obj5 = {...'y',...'x'}   // {0: "x" }

Bei anderen primitiven Datentypen wird jedoch ein leeres Objekt zurückgegeben

mit Zahlen

let obj6 = { ...0.0, ...55} // {}

mit Boolean

let obj7 = { ...true, ...false} // {}

Zusammenfassend lässt sich sagen, dass die Datentypen, die bei Verwendung mit dem Spread-Operator in Form von Schlüssel-Wert-Paaren behandelt werden können, ein {...}nicht leeres Objekt zurückgeben, andernfalls ein leeres Objekt{}

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.