Heim  >  Artikel  >  Web-Frontend  >  Tschüss „JSON.stringify()“ und „{...obj}“, Hallo „structuredClone()“!

Tschüss „JSON.stringify()“ und „{...obj}“, Hallo „structuredClone()“!

WBOY
WBOYOriginal
2024-09-04 18:32:02521Durchsuche

Bye-Bye `JSON.stringify()` and `{...obj}`, Hello `structuredClone()`!

  • Was ist structureClone()?

    • structureClone() ist eine 2022 eingeführte globale Funktion, die das tiefe Klonen von JavaScript-Objekten ermöglicht. Im Gegensatz zu herkömmlichen Methoden wie JSON.stringify() und JSON.parse(), die mit komplexen Strukturen und Zirkelverweisen zu kämpfen haben, meistert structureClone() diese Herausforderungen mühelos.
  • Warum ist es ein Game-Changer?

    • Es ist ein robustes Tool zum Erstellen echter Deep Clones, das die Integrität verschachtelter Objekte und Zirkelverweise bewahrt, ohne dass zusätzliche Logik oder Problemumgehungen erforderlich sind. Außerdem ist es in modernen Umgebungen verfügbar, einschließlich Web Workers.

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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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

  • Verwenden von {...obj}
  const original = { name: "Alice", greet: () => "Hello!", value: undefined };
  const shallowCopy = { ...original };

  console.log(shallowCopy.greet()); // "Hello!"
  console.log(shallowCopy.value); // undefined
  • 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
  • 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
  • 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");
  • 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!

Stellungnahme:
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
Vorheriger Artikel:mjs vs. cjs mit Event LoopNächster Artikel:mjs vs. cjs mit Event Loop