In diesem Artikel wird eine gemeinsame JavaScript -Frage untersucht: Warum der strenge Gleichstellungsoperator (===
) beim Vergleich von Arrays und Objekten nicht wie erwartet funktioniert. Wir werden uns mit JavaScripts internen Arbeiten befassen, um dieses Verhalten zu verstehen.
JavaScript unterscheidet zwischen primitiven und nicht primitiven Datentypen. Primitive Typen (boolean, null, undefiniert, Zeichenfolge, Anzahl) werden von Wert übergeben, während nichtprimitive Typen (Arrays, Funktionen und Objekte-alle technisch gesehenen Objekte) durch Referenz übergeben werden.
Primitives Typverhalten (nach Wert bestehen)
Wenn Sie eine primitive Variable deklarieren, wird der Wert direkt gespeichert:
<code class="language-javascript">const name = 'John'; const age = 25;</code>
Variable | Value |
---|---|
name | 'John' |
age | 25 |
Nicht primitives Typverhalten (durch Referenz passieren)
nicht primitive Variablen speichern eine Referenz auf den Speicherort des Objekts, nicht auf das Objekt selbst:
<code class="language-javascript">const name = 'John'; const age = 25;</code>
enthält zunächst fruits
eine Referenz (z. B. Speicheradresse H001), die auf ein leeres Array hinweist. Nach push()
wird das Array bei H001 geändert.
Referenzkopieren
Wenn Sie eine Referenzvariable mit =
kopieren, kopieren Sie die Referenz, nicht die Daten des Objekts:
<code class="language-javascript">const fruits = []; fruits.push('Banana');</code>
Sowohl fruits
als auch yellowFruits
verweisen nun auf denselben Speicherort. Eine Änderung des anderen verändert die andere.
addiert 'Ananas' zu yellowFruits
auch fruits
, da sie dieselbe Referenz teilen.
Referenzvariablen
neu zuweisenNeuzuweisung einer Referenzvariablen erstellt eine neue Referenz:
<code class="language-javascript">const fruits = ['Banana']; const yellowFruits = fruits;</code>
Das ursprüngliche Objekt { name: 'John' }
bleibt im Speicher, aber person
zeigt nun auf ein neues Objekt { name: 'Mary' }
.
Warum ===
mit Arrays und Objekten
Der Operator ===
vergleicht Referenzen für nicht primitive Typen. Deshalb:
<code class="language-javascript">let person = { name: 'John' }; person = { name: 'Mary' };</code>
Auch wenn arr1
und arr3
identische Inhalte haben, haben sie unterschiedliche Speicheradressen, was zu false
.
Funktionsparameter und Reinheit
Übergeben primitiver Werte an Funktionen kopiert den Wert. Das Übergeben von Objekten besteht jedoch über die Referenz. Diese Unterscheidung ist entscheidend, um reine und unreine Funktionen zu verstehen.
Um eine reine Funktion zu erstellen, die ein Objekt verändert, erstellen Sie eine Kopie vor der Änderung:
<code class="language-javascript">const arr1 = ['1']; const arr2 = arr1; // Same reference console.log(arr1 === arr2); // true const arr3 = ['1']; // Different reference console.log(arr1 === arr3); // false</code>
In Zusammenfassung
===
vergleicht Referenzen für nicht primitive Typen. für einen tieferen Eintauchen in die JavaScript -Speicherverwaltung, erkunden Sie den Anrufstack und den Speicherhaufen.
Das obige ist der detaillierte Inhalt vonWarum können wir Arrays und Objekte nicht mit === vergleichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!