Heim > Web-Frontend > js-Tutorial > Warum können wir Arrays und Objekte nicht mit === vergleichen?

Warum können wir Arrays und Objekte nicht mit === vergleichen?

DDD
Freigeben: 2025-01-29 20:37:08
Original
461 Leute haben es durchsucht

Why can’t we compare arrays and objects with ===

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>
Nach dem Login kopieren
Nach dem Login kopieren
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>
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren

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 zuweisen

Neuzuweisung einer Referenzvariablen erstellt eine neue Referenz:

<code class="language-javascript">const fruits = ['Banana'];
const yellowFruits = fruits;</code>
Nach dem Login kopieren

Das ursprüngliche Objekt { name: 'John' } bleibt im Speicher, aber person zeigt nun auf ein neues Objekt { name: 'Mary' }.

Warum === mit Arrays und Objekten

fehlschlägt

Der Operator === vergleicht Referenzen für nicht primitive Typen. Deshalb:

<code class="language-javascript">let person = { name: 'John' };
person = { name: 'Mary' };</code>
Nach dem Login kopieren

Auch wenn arr1 und arr3 identische Inhalte haben, haben sie unterschiedliche Speicheradressen, was zu false.

führt

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.

  • reine Funktionen: Ändern Sie den externen Zustand nicht. Sie arbeiten ausschließlich auf ihren Eingängen und erzeugen vorhersehbare Ausgänge.
  • unreine Funktionen: kann als Argumente übergebene Objekte ändern, die das ursprüngliche Objekt außerhalb des Bereichs der Funktion beeinflussen.

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>
Nach dem Login kopieren

In Zusammenfassung

  1. primitive Typen werden von Wert übergeben; Nicht primitive Typen werden mit Referenz übergeben.
  2. === vergleicht Referenzen für nicht primitive Typen.
  3. Referenzkopieren verstehen, ist von entscheidender Bedeutung für das Schreiben vorhersehbarer und wartbarer Code.
  4. reine Funktionen vermeiden Nebenwirkungen, indem sie den externen Zustand nicht ändern.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage