„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Tschüss „JSON.stringify()“ und „{...obj}“, Hallo „structuredClone()“!

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

Veröffentlicht am 08.11.2024
Durchsuche:536

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 Workern.

1. Einfaches Klonen von Objekten: Die Grundlagen

  • Verwenden von {...obj} (Shallow Copy)
  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 passiert?

    • Der Spread-Operator {...obj} erstellt nur eine flache Kopie. Das Objekt „details“ wird nicht tief geklont, daher wirken sich Änderungen an „shallowCopy.details“ auch auf die ursprünglichen Details aus.
    • Verwenden 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 passiert?

    • Diese Methode erstellt eine tiefe Kopie, hat aber 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 passiert?
    • 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 passiert?

    • {...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 passiert?

    • JSON.stringify() schlägt auch bei Zirkelverweisen fehl und löst einen Fehler aus.
    • Zirkuläre Referenz 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 passiert?
    • 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 passiert?

    • {...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 passiert?

    • JSON.stringify() kann keine oder undefinierte Funktionen serialisieren, 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 passiert?
    • 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 passiert?
    • 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 Deep Cloning 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.
Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/dharamgfx/bye-bye-jsonstringify-and-obj-hello-structuredclone-2e4c?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3