Heim > Web-Frontend > js-Tutorial > Flach und tiefes Kopieren in JavaScript

Flach und tiefes Kopieren in JavaScript

Jennifer Aniston
Freigeben: 2025-02-09 08:28:10
Original
904 Leute haben es durchsucht

Shallow vs. Deep Copying in JavaScript

Kopieren von JavaScript -Objekten ist nicht so einfach, wie es scheint. Das Verständnis, wie Objekte und Referenzen während dieses Prozesses funktionieren, ist für Webentwickler von entscheidender Bedeutung und kann Stunden der Debugging -Zeit sparen. Dies wird immer wichtiger, wenn Sie große staatliche Anwendungen verwenden, wie z. B. die in React oder Vue gebauten.

flache Kopie und Deep Copy beziehen Sie sich, wie wir Kopien von Objekten in JavaScript erstellen und welche Daten wir in "Kopie" erstellen. In diesem Artikel werden wir tief in die Unterschiede zwischen diesen Methoden eintauchen, ihre praktischen Anwendungen untersuchen und mögliche Fallstricke aufdecken, die bei der Verwendung auftreten können.

Schlüsselpunkte

  • flache Kopie in JavaScript erstellt ein neues Objekt, das die Eigenschaften eines vorhandenen Objekts kopiert, jedoch denselben Hinweis auf den ursprünglichen Wert oder Objekt behält. Dies bedeutet, dass Änderungen an verschachtelten Objekten in flachen Repliken auch das ursprüngliche Objekt und alle anderen flachen Repliken beeinflussen.
  • Auf der anderen Seite erstellt Deep Copy eine genaue Kopie eines vorhandenen Objekts, einschließlich aller Eigenschaften und verschachtelten Objekte, anstatt nur Referenzen. Dies macht ein tiefes Kopieren von Vorteil, wenn Sie zwei separate Objekte benötigen, die keine Referenzen teilen, um sicherzustellen, dass Änderungen an einem Objekt die andere nicht beeinflussen.
  • Während die tiefe Replikation die Vorteile der Datengenauigkeit bietet, kann es auch einige Nachteile wie Leistungsauswirkungen, erhöhtes Speicherverbrauch, kreisförmige Referenzprobleme, Funktionen und spezielle Objektbearbeitung und Komplexität der Implementierung aufweisen. Daher ist es wichtig zu bewerten, ob für jeden bestimmten Anwendungsfall eine tiefe Replikation erforderlich ist.

Was ist "flach" Kopie

flache Kopie bezieht sich auf den Prozess des Erstellens eines neuen Objekts, bei dem es sich um eine Kopie eines vorhandenen Objekts handelt, dessen Eigenschaften sich auf denselben numerischen Wert oder Objekt wie das ursprüngliche Objekt beziehen. In JavaScript wird dies normalerweise mit Methoden wie Object.assign() oder Expansionssyntax ({...originalObject}) erreicht. Durch die flache Kopie werden nur neue Verweise auf vorhandene Objekte oder Werte erstellt und erstellt keine tiefe Kopie, was bedeutet, dass noch verschachtelte Objekte verwiesen werden, nicht Duplikate.

Schauen wir uns das folgende Code -Beispiel an. Das neu erstellte Objekt shallowCopyZoo ist eine Kopie von zoo, die durch Erweiterung des Bedieners erstellt wurde, das einige unerwartete Konsequenzen hat.

let zoo = {
  name: "Amazing Zoo",
  location: "Melbourne, Australia",
  animals: [
    {
      species: "Lion",
      favoriteTreat: "?",
    },
    {
      species: "Panda",
      favoriteTreat: "?",
    },
  ],
};

let shallowCopyZoo = { ...zoo };
shallowCopyZoo.animals[0].favoriteTreat = "?";
console.log(zoo.animals[0].favoriteTreat); 
// "?",而不是 "?"
Nach dem Login kopieren
Nach dem Login kopieren

Aber mal sehen, was genau in shallowCopyZoo ist. Die Eigenschaften name und location sind die ursprünglichen Werte (Zeichenfolgen), so dass ihre Werte kopiert werden. Die Eigenschaft animals ist jedoch ein Array von Objekten, also ist das, was kopiert wird, ein Verweis auf dieses Array, nicht auf das Array selbst.

Sie können den strengen Gleichstellungsoperator (===) verwenden, um dies schnell zu testen (wenn Sie mir nicht glauben). Nur wenn sich ein Objekt auf dasselbe Objekt bezieht, ist ein Objekt einem anderen Objekt gleich (siehe primitive Datentypen und Referenzdatentypen). Beachten Sie, dass die animals -attribute in beiden gleich sind, das Objekt selbst nicht gleich ist.

let zoo = {
  name: "Amazing Zoo",
  location: "Melbourne, Australia",
  animals: [
    {
      species: "Lion",
      favoriteTreat: "?",
    },
    {
      species: "Panda",
      favoriteTreat: "?",
    },
  ],
};

let shallowCopyZoo = { ...zoo };
shallowCopyZoo.animals[0].favoriteTreat = "?";
console.log(zoo.animals[0].favoriteTreat); 
// "?",而不是 "?"
Nach dem Login kopieren
Nach dem Login kopieren

Dies kann potenzielle Probleme in der Codebasis verursachen und ist besonders schwierig, wenn es um große Modifikationen geht. Das Ändern verschachtelter Objekte in flachen Repliken wirkt sich auch auf das ursprüngliche Objekt und alle anderen flachen Repliken aus, da sie alle dieselbe Referenz haben.

Deep Copy

Deep Copy ist ein Trick, um ein neues Objekt zu erstellen, das eine genaue Kopie eines vorhandenen Objekts ist. Dies beinhaltet das Kopieren aller Eigenschaften und alle verschachtelten Objekte und nicht alle Referenzen. Tiefes Klonen ist nützlich, wenn Sie zwei separate Objekte benötigen, die keine Referenzen teilen, um sicherzustellen, dass Änderungen an einem Objekt die andere nicht beeinflussen.

Programmierer verwenden häufig ein tiefes Klonen, wenn sie sich mit Anwendungsstatusobjekten in komplexen Anwendungen befassen. Das Erstellen eines neuen Zustandsobjekts ohne Beeinflussung des vorherigen Zustands ist entscheidend für die Aufrechterhaltung der Anwendungsstabilität und die korrekte Implementierung der Rückgängigkeits-/Wiederherstellungsfunktionalität.

wie man JSON.stringify() und JSON.parse() für Deep Copy

verwendet

Eine beliebte und bibliotheksfreie Tiefenkopie-Methode besteht darin, die integrierten Methoden JSON.stringify() und JSON.parse() zu verwenden.

parse(stringify()) Die Methode ist nicht perfekt. Beispielsweise werden spezielle Datentypen wie Date in Zeichenfolgen konvertiert und undefinierte Werte werden ignoriert. Wie bei allen Optionen in diesem Artikel sollten Sie es anhand Ihres spezifischen Anwendungsfalls berücksichtigen.

Im folgenden Code werden wir diese Methoden verwenden, um eine deepCopy -Funktion zu erstellen, um ein Objekt tief zu klonen. Dann kopieren wir das playerProfile Objekt und ändern das kopierte Objekt, ohne das ursprüngliche Objekt zu beeinflussen. Dies zeigt den Wert der tiefen Replikation bei der Aufrechterhaltung unabhängiger Objekte, die keine Referenzen teilen.

console.log(zoo.animals === shallowCopyZoo.animals)
// true

console.log(zoo === shallowCopyZoo)
// false
Nach dem Login kopieren

Bibliothek für tiefe Replikation

Es gibt auch eine Vielzahl von Bibliotheken von Drittanbietern, die tiefe Replikationslösungen bieten.

    Die
  • -Funktionen der Lodash -Bibliothek können Richtlinien, Funktionen und Spezialobjekte korrekt verarbeiten. cloneDeep()
  • Funktion der JQuery Library extend() Die [deep = true] Immerbibliothek wurde für React-Redux-Entwickler erstellt und bietet bequeme Tools zum Ändern von Objekten.
  • Vanille JS Deep Copy Function

Wenn Sie aus irgendeinem Grund keine JSON-Objekte oder Bibliotheken von Drittanbietern verwenden möchten, können Sie auch eine benutzerdefinierte Deep Copy-Funktion in Vanilla JavaScript erstellen. Die Funktion wird rekursiv über die Objekteigenschaften iteriert und erstellt ein neues Objekt mit denselben Eigenschaften und Werten.

Nachteile der tiefen Kopie
const playerProfile = {
  name: 'Alice',
  level: 10,
  achievements: [
    {
      title: 'Fast Learner',
      emoji: '?'
    },
    {
      title: 'Treasure Hunter',
      emoji: '?'
    }
  ]
};

function deepCopy(obj) {
  return JSON.parse(JSON.stringify(obj));
}

const clonedProfile = deepCopy(playerProfile);

console.log(clonedProfile);
// 输出与playerProfile相同

// 修改克隆的配置文件而不影响原始配置文件
clonedProfile.achievements.push({ title: 'Marathon Runner', emoji: '?' });
console.log(playerProfile.achievements.length); // 输出:2
console.log(clonedProfile.achievements.length); // 输出:3
Nach dem Login kopieren

Während die tiefe Replikation große Vorteile für die Datengenauigkeit bietet, wird empfohlen, zu bewerten, ob für jeden bestimmten Anwendungsfall eine tiefe Replikation erforderlich ist. In einigen Fällen können ein flaches Kopieren oder andere Techniken zur Verwaltung von Objektreferenzen angemessener sein, wodurch eine bessere Leistung und die Komplexität verringert werden.

  1. Leistungsauswirkungen: Tiefe Replikation kann rechnerisch teuer sein, insbesondere wenn es sich um große oder komplexe Objekte handelt. Da der tiefe Replikationsprozess über alle verschachtelten Eigenschaften iteriert, kann es viel Zeit in Anspruch nehmen, um die Leistung Ihrer Anwendung negativ zu beeinflussen.
  2. Speicherkonsum: Erstellen von tiefen Kopien Ergebnissen in der gesamten Objekthierarchie, einschließlich aller verschachtelten Objekte. Dies kann zu einem erhöhten Speicherverbrauch führen, der zu einem Problem in der Speicherbeschränkung oder bei der Verarbeitung großer Datensätze werden kann.
  3. runde Referenz: Tiefes Kopieren kann Probleme verursachen, wenn ein Objekt eine kreisförmige Referenz enthält (d. H. Wenn sich die Eigenschaften eines Objekts direkt oder indirekt auf sich selbst beziehen). Loop -Referenzen können während des tiefen Kopierens unendliche Schleifen oder Stapelüberlauffehler verursachen, und die Handhabung erfordert zusätzliche Logik, um diese Probleme zu vermeiden.
  4. Funktion und spezielle Objektbearbeitung: Deep Copy kann möglicherweise keine Funktionen oder Objekte mit speziellen Eigenschaften wie erwartet verarbeiten (z. B. Date, RegExp, DOM -Elemente). Wenn beispielsweise ein tiefes Kopieren eines Objekts, das eine Funktion enthält, kann ein Verweis auf die Funktion kopiert werden, aber der Verschluss der Funktion und ihr gebundener Kontext wird nicht kopiert. Ebenso können Objekte mit besonderen Merkmalen ihre einzigartigen Eigenschaften und ihr Verhalten verlieren, wenn sie tief repliziert werden.
  5. Implementierungskomplexität: Das Schreiben einer benutzerdefinierten Deep Copy-Funktion kann kompliziert sein, und integrierte Methoden wie JSON.parse(JSON.stringify(obj)) haben auch einige Einschränkungen, z. Während es einige Bibliotheken von Drittanbietern gibt, wie z. _.cloneDeep()
Schlussfolgerung

Vielen Dank, dass Sie sich die Zeit genommen haben, diesen Artikel zu lesen. Flache und tiefe Replikation sind viel komplexer, als jeder Anfänger denken könnte. In jedem Ansatz gibt es viele Fallstricke, und nimmt sich die Zeit, um diese Optionen zu überprüfen und zu berücksichtigen, dass Ihre Anwendung und Daten, wie Sie aussehen möchten.

FAQs über flache und tiefe Replikation in JavaScript (FAQ)

Was ist der Hauptunterschied zwischen flacher und tiefer Replikation in JavaScript?

Der Hauptunterschied zwischen flacher und tiefer Replikation ist die Art und Weise, wie sie Eigenschaften als Objekte umgehen. In der flachen Kopie teilt das kopierte Objekt denselben Hinweis auf das verschachtelte Objekt wie das ursprüngliche Objekt. Dies bedeutet, dass Änderungen an verschachtelten Objekten im ursprünglichen Objekt und im Kopierobjekt widerspiegelt werden. Die tiefe Replikation hingegen schafft neue Instanzen verschachtelter Objekte, was bedeutet, dass Änderungen an verschachtelten Objekten im replizierten Objekt das ursprüngliche Objekt nicht beeinflussen.

Wie funktioniert der Erweiterungsbetreiber in einer flachen Kopie?

Der Erweiterungsoperator (…) in JavaScript wird normalerweise zum flachen Kopieren verwendet. Es kopiert alle aufzählbaren Eigenschaften eines Objekts zu einem anderen. Es kopiert jedoch nur die Attribute der ersten Ebene und Verweise auf verschachtelte Objekte. Daher wirken sich Änderungen an verschachtelten Objekten auf das ursprüngliche Objekt und das kopierte Objekt aus.

Kann ich die JSON -Methode zum Tiefenkopieren verwenden?

Ja, Sie können die JSON -Methode verwenden, um ein tiefes Kopieren in JavaScript durchzuführen. Eine Kombination aus JSON.stringify() und JSON.parse() Methoden erzeugt eine tiefe Kopie eines Objekts. JSON.stringify() konvertiert das Objekt in eine Zeichenfolge, JSON.parse() analysiert die Zeichenfolge zurück in das neue Objekt. Diese Methode hat jedoch einige Einschränkungen, da sie die Methode nicht kopiert und nicht für spezielle JavaScript -Objekte wie Date, RegExp, Map, Set usw. geeignet ist.

Was sind die Grenzen der flachen Replikation?

flache Kopie reproduziert nur die Attribute und Verweise auf die erste Ebene auf verschachtelte Objekte. Wenn das ursprüngliche Objekt verschachtelte Objekte enthält, beeinflussen Änderungen an diesen verschachtelten Objekten das ursprüngliche Objekt und das kopierte Objekt. Dies kann zu unerwarteten Ergebnissen und Fehlern im Code führen.

Object.assign() Wie funktioniert die Methode in einer flachen Kopie?

Die

Object.assign() Methode wird verwendet, um die Werte aller aufzählbaren Eigenschaften eines oder der Quellobjekte in das Zielobjekt zu kopieren. Es gibt das Zielobjekt zurück. Es führt jedoch ein flaches Kopieren durch, was bedeutet, dass es nur die Eigenschaften der ersten Ebene und Verweise auf verschachtelte Objekte kopiert.

Was ist der beste Weg, um Objekte in JavaScript zu kopieren?

Der beste Weg, um Objekte in JavaScript zu kopieren, hängt von den spezifischen Anforderungen des Codes ab. Wenn Ihr Objekt keine Methoden oder spezielle JavaScript -Objekte enthält, können Sie eine Kombination aus Methoden JSON.stringify() und JSON.parse() verwenden. Für komplexere Objekte möchten Sie Bibliotheken wie Lodash verwenden, die tiefgreifende Klonfunktionen liefern.

Kann ich den Erweiterung Operator für ein tiefes Kopieren verwenden?

Nein, der Erweiterungsoperator in JavaScript führt nur ein flaches Kopieren durch. Es kopiert das Attribut der ersten Ebene und Verweise auf verschachtelte Objekte. Um eine tiefe Replikation durchzuführen, müssen Sie eine andere Methode oder Bibliothek verwenden.

Was hat die Leistungsauswirkungen der tiefen Replikation?

tiefe Replikation kann mehr Ressourcen als flache Replikation konsumieren, insbesondere für große Objekte. Dies liegt daran, dass Deep Copy neue Instanzen für alle verschachtelten Objekte erstellt, die mehr Speicher- und Verarbeitungsleistung in Anspruch nehmen können.

Wie kann man mit kreisförmigen Referenzen in der tiefen Replikation umgehen?

Deep Copy -Methoden wie

JSON.stringify() und JSON.parse() verarbeiten keine kreisförmigen Referenzen und werfen einen Fehler. Eine kreisförmige Referenz tritt auf, wenn sich die Eigenschaften eines Objekts auf das Objekt selbst beziehen. Um kreisförmige Referenzen zu verarbeiten, müssen Sie eine Bibliothek verwenden, die sie unterstützt, z. B. Lodash.

Warum sollte ich mich um den Unterschied zwischen flacher Kopie und tiefen Kopie kümmern?

Das Verständnis des Unterschieds zwischen flacher und tiefer Replikation ist entscheidend für die Verwaltung von Daten in JavaScript. Es wirkt sich aus, wie Ihre Objekte miteinander interagieren. Wenn Sie nicht vorsichtig sind, kann das flache Kopieren zu unerwarteten Ergebnissen und Fehlern führen, da Änderungen an verschachtelten Objekten die ursprünglichen und kopierten Objekte beeinflussen. Die Deep Copy hingegen stellt sicher, dass Ihr Kopierobjekt völlig unabhängig vom ursprünglichen Objekt ist.

Das obige ist der detaillierte Inhalt vonFlach und tiefes Kopieren in JavaScript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage