Schauen wir uns zunächst ein Beispiel an:
<script> var a = {n:1}; var b = a; a.x = a = {n:2}; console.log(a.x);// --> undefined console.log(b.x);// --> [object Object] </script>
Das obige Beispiel scheint einfach zu sein, aber das Ergebnis ist nicht leicht zu verstehen und es ist leicht, Menschen zu verwirren – „Zeigt a.x nicht auf Objekt a? Warum ist log(a.x) undefiniert?“, „B.x nicht.“ Sollte es dasselbe sein wie a.x? Warum gibt es zwei Objekte im Protokoll?“
Natürlich können Sie es zunächst selbst verstehen. Wenn Sie die Gründe und den Funktionsmechanismus verstehen, müssen Sie nicht weiterlesen.
Lassen Sie uns die Arbeitsschritte dieses einfachen Codes analysieren, um besser zu verstehen, wie die „Zuweisung“ von js-Referenztypen funktioniert.
Zuallererst
var a = {n:1};
var b = a;
Dieser Schritt ist leicht zu verstehen. Fahren Sie dann mit der nächsten Zeile mit sehr wichtigem Code fort:
a.x = a = {n:2};
Wir wissen, dass die Reihenfolge der Zuweisungsoperationen in js immer von rechts nach links ist, aber da „.“ der Operator mit der höchsten Priorität ist, „berechnet“ diese Codezeile zuerst a.x.
Das ist zu diesem Zeitpunkt passiert – das Objekt {n:1}, auf das a zeigt, hat ein neues Attribut x (obwohl dieses x undefiniert ist):
Wie Sie auf dem Bild sehen können, können Sie, da b wie a auf Objekt A zeigt, zusätzlich zur Verwendung von a.x zur Darstellung des x-Attributs von A natürlich auch b.x zur Darstellung verwenden.
Dann wird a={n:2} zuerst gemäß der Zuweisungsoperationssequenz „von rechts nach links“ ausgeführt. Zu diesem Zeitpunkt ändert sich das Objekt, auf das a zeigt, und wird zu einem neuen Objekt {n:2} (wir rufen auf). it Für Objekt B):
Führen Sie dann weiterhin a.x=a aus. Viele Leute werden denken, dass dies so ist: „Objekt B hat auch ein neues Attribut x hinzugefügt und zeigt auf Objekt B selbst“
Aber das ist nicht wirklich der Fall. Da js a.x bereits zu Beginn berechnet hat, hat es bereits analysiert, dass a.x das x von Objekt A ist. Wenn Sie also zurückkommen, um a.x einen Wert zuzuweisen x von Objekt B.
Also sollte a.x=a so verstanden werden, dass das Attribut x von Objekt A auf Objekt B zeigt:
Dann wird das Ergebnis zu diesem Zeitpunkt offensichtlich sein. Bei console.log(a.x) zeigt a auf Objekt B, aber Objekt B hat kein Attribut x. Das ist in Ordnung, wenn JavaScript nach einer Eigenschaft für ein Objekt sucht, durchläuft es die Prototypenkette, bis es eine Eigenschaft mit einem bestimmten Namen findet. Wenn die Suche jedoch den Anfang der Prototypenkette erreicht, also Object.prototype, wird die angegebene Eigenschaft B.prototype.x immer noch nicht gefunden und undefiniert wird natürlich ausgegeben
Wenn console.log (b.x) das x-Attribut von Objekt A darstellt, das auf Objekt B zeigt, wird [Objekt Objekt] natürlich ausgegeben. Beachten Sie, dass [Objekt Objekt] hier nicht 2 ist Die Bedeutung eines Objekts , die Zeichenfolgenform des Objekts, ist ein impliziter Aufruf der toString()-Methode des Object-Objekts in der Form: „[object Object]“. [Objekt Objekt] repräsentiert also nur ein Objekt
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er gefällt Ihnen allen.