1. Einfaches Klonen von Objekten: Die Grundlagen
-
Verwenden von {...obj} (Flache Kopie)
const original = { name: "Alice", details: { age: 25 } };
const shallowCopy = { ...original };
shallowCopy.details.age = 30;
console.log(original.details.age); // 30
console.log(shallowCopy.details.age); // 30
Nach dem Login kopieren
-
Was ist los?
- Der Spread-Operator {...obj} erstellt nur eine flache Kopie. Das Detailobjekt wird nicht tief geklont, daher wirken sich Änderungen an flatCopy.details auch auf die Originaldetails aus.
-
Verwendung von JSON.stringify() + JSON.parse() (Deep Copy)
const original = { name: "Alice", details: { age: 25 } };
const deepCopy = JSON.parse(JSON.stringify(original));
deepCopy.details.age = 30;
console.log(original.details.age); // 25
console.log(deepCopy.details.age); // 30
Nach dem Login kopieren
-
Was ist los?
- Diese Methode erstellt eine tiefe Kopie, hat jedoch Einschränkungen: Sie kann keine Funktionen, undefinierten oder Zirkelverweise verarbeiten.
-
Verwenden von structureClone() (Deep Copy)
const original = { name: "Alice", details: { age: 25 } };
const clone = structuredClone(original);
clone.details.age = 30;
console.log(original.details.age); // 25
console.log(clone.details.age); // 30
Nach dem Login kopieren
-
Was ist los?
-
structureClone() erstellt einen tiefen Klon, wobei die Struktur ohne die Einschränkungen von JSON.stringify() erhalten bleibt und komplexe Datentypen wie Zirkelverweise und undefiniert verarbeitet werden.
2. Umgang mit Zirkelverweisen: Eine Herausforderung
-
Zirkelverweis mit {...obj}
const original = { name: "Alice" };
original.self = original;
// This will cause an error:
const shallowCopy = { ...original }; // TypeError: Converting circular structure to JSON
Nach dem Login kopieren
-
Was ist los?
-
{...obj} kann Zirkelverweise nicht verarbeiten, was zu einem Fehler führt.
-
Zirkuläre Referenz mit JSON.stringify()
const original = { name: "Alice" };
original.self = original;
// This will cause an error:
const jsonCopy = JSON.parse(JSON.stringify(original)); // TypeError: Converting circular structure to JSON
Nach dem Login kopieren
-
Was ist los?
-
JSON.stringify() schlägt auch bei Zirkelverweisen fehl und löst einen Fehler aus.
-
Zirkelreferenz mit structureClone()
const original = { name: "Alice" };
original.self = original;
const clone = structuredClone(original);
console.log(clone !== original); // true
console.log(clone.self === clone); // true
Nach dem Login kopieren
-
Was ist los?
-
structureClone() verarbeitet Zirkelverweise nahtlos und erstellt einen ordnungsgemäßen Deep Clone ohne Fehler.
3. Klonen mit Funktionen und undefiniert: Ein weiterer Test
const original = { name: "Alice", greet: () => "Hello!", value: undefined };
const shallowCopy = { ...original };
console.log(shallowCopy.greet()); // "Hello!"
console.log(shallowCopy.value); // undefined
Nach dem Login kopieren
-
Was ist los?
-
{...obj} kopiert Funktionen und undefiniert wie erwartet, aber nur oberflächlich.
-
Verwenden von JSON.stringify()
const original = { name: "Alice", greet: () => "Hello!", value: undefined };
const jsonCopy = JSON.parse(JSON.stringify(original));
console.log(jsonCopy.greet); // undefined
console.log(jsonCopy.value); // undefined
Nach dem Login kopieren
-
Was ist los?
-
JSON.stringify() kann keine Funktionen serialisieren oder undefiniert sein, was zu deren Verlust im geklonten Objekt führt.
-
Verwenden von structureClone()
const original = { name: "Alice", greet: () => "Hello!", value: undefined };
const clone = structuredClone(original);
console.log(clone.greet); // undefined
console.log(clone.value); // undefined
Nach dem Login kopieren
-
Was ist los?
-
structureClone() klont auch keine Funktionen, behält aber undefinierte Werte bei, was es für komplexe Objekte zuverlässiger als JSON.stringify() macht.
4. Geschwindigkeit und Effizienz: Ein Leistungshinweis
-
Effizienz mit großen Datenmengen
const largeArray = new Array(1e6).fill({ key: "value" });
console.time("structuredClone");
const clone = structuredClone(largeArray);
console.timeEnd("structuredClone");
console.time("JSON.stringify + JSON.parse");
const jsonCopy = JSON.parse(JSON.stringify(largeArray));
console.timeEnd("JSON.stringify + JSON.parse");
Nach dem Login kopieren
-
Was ist los?
-
structureClone() ist bei großen, komplexen Daten oft schneller als JSON.stringify() + JSON.parse() und vermeidet die Fallstricke der Serialisierung und Deserialisierung.
5. Fazit: Warum structureClone() die Zukunft ist
-
Zuverlässigkeit: Behandelt Zirkelverweise, Funktionen und undefinierte Werte vorhersehbarer.
-
Effizienz: Führt tiefes Klonen bei großen Datensätzen schneller durch und erfordert keine Problemumgehungen.
-
Einfachheit: Eine Methode, um sie alle zu beherrschen – keine Wahl mehr zwischen {...obj}, JSON.stringify() oder benutzerdefinierten Deep-Clone-Funktionen.
Das obige ist der detaillierte Inhalt vonTschüss „JSON.stringify()' und „{...obj}', Hallo „structuredClone()'!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!