Mutable Objekt
In JavaScript sind Objekte Referenzdaten. Der Vorteil besteht darin, dass Objekte, die häufig geändert werden, basierend auf dem ursprünglichen Objekt geändert werden und nicht nachgebaut werden müssen. Dies kann das Gedächtnis effektiv nutzen und keine Verschwendung von Speicherraum verursachen. Dieses Merkmal von Objekten kann als Mutable bezeichnet werden, was auf Chinesisch "veränderlich" bedeutet.
Für veränderliche Objekte kann seine Flexibilität und Veränderung manchmal zu ihren Nachteilen werden. Je flexibler und veränderlicher die Daten sind, desto schwieriger ist es zu steuern. Für ein Objekt mit einer komplexen Struktur werden die Daten versehentlich versehentlich versehentlich geändert. Wenn das Objekt in mehreren Scopes verwendet wird, ist es schwierig, festzustellen, ob sich die Daten ändern.
var obj = {/* ein Objekt mit einer komplexen Struktur*/}; Dosenthing (OBJ); // Nach der obigen Funktionslinie ist OBJ zu diesem Zeitpunkt immer noch der ursprüngliche OBJ?Um dieses Problem anzugehen, kann eine herkömmliche Lösung ein neues Objekt kopieren, indem sie das Objekt tief kopiert und anschließend auf dem neuen Objekt geändert wird. Dies kann die Kontrolle der Daten sicherstellen, aber das häufige Kopieren führt zu viel Speicherplatzverschwendung.
var obj = {/* Ein Objekt mit einer komplexen Struktur*/}; // Kopie erstellt eine neue OBJ2 //, aber die Kopieroperation verschwendet den Speicherraum var obj2 = DeepClone (OBJ); DosenstadiumUnveränderliches Objekt
Um die oben genannten Probleme besser zu lösen, erscheint das unveränderliche Objekt, das "unveränderlich" buchstäblich ins Chinesische übersetzt ist. Jedes Mal, wenn ein unveränderliches Objekt geändert wird, wird ein neues unveränderliches Objekt erstellt. Der Betrieb des neuen Objekts wirkt sich nicht auf die Daten des ursprünglichen Objekts aus. Dieses spezielle Objekt ist nicht das neue funktionale Merkmal von JavaScript, sondern eine Reihe von Lösungen der Branche zur Lösung dieses Problems, und einige hervorragende Open -Source -Bibliotheken sind entstanden, von denen das bekannteste Open Source von Facebook von Lee Byron von Facebook ist. Natürlich ist die Lösung von Untau nach nicht original, sondern stammt von Clojure und Scala.
Leistungsvergleich zwischen veränderlich und unveränderlich
Der ineffiziente Betrieb veränderlicher Objekte spiegelt sich hauptsächlich in Replikation und Vergleich wider, und das unveränderliche Objekt löst diese beiden ineffizienten Schmerzpunkte.
Die tiefe Kopieroperation gewöhnlicher veränderlicher Objekte kopiert die gesamten Daten. Das unveränderliche Objekt kopiert nicht die gesamten Daten bei der Änderung der Daten, sondern überträgt die Eltern-Kind-Beziehung zwischen dem geänderten Knoten und dem unveränderten Knoten auf einen neuen Knoten, ähnlich der Struktur einer verknüpften Liste. Aus Sicht der "Kopie" wird die Replikationsminimierung erreicht und die unveränderten Teile werden geteilt. Mutierbar ist beim Kopieren "voll", während unveränderlich "inkrementell" ist, was die hohe oder niedrige Nutzungsrate des Speicherraums bestimmt.
Und basierend auf der Funktion, dass jedes Mal ein unveränderliches Objekt geändert wird, wird ein neues unveränderliches Objekt erstellt. Dies kann den geänderten Status der Daten in einer Reihe von Schnappschüssen speichern, was ebenfalls sehr bequem ist.
Lassen Sie uns über den Vergleichsvorgang sprechen. Wenn Sie für veränderliche Objekte vergleichen möchten, ob die beiden Objekte gleich sind, müssen Sie jeden Knoten des Objekts zum Vergleich durchqueren. Für Objekte mit komplexen Strukturen ist ihre Effizienz definitiv nicht viel höher. Für unveränderliche Objekte liefert unveränderliche.js eine API, die direkt bestimmt, ob die "Werte" von zwei unveränderlichen Objekten gleich sind.
var map1 = unveränderlich. // für verschiedene unveränderliche Instanzen behauptet die Referenzadresse (unveränderlich.IS (MAP1, MAP2)); // Die Werte von MAP1 und MAP2 sind gleich und die Werte geltend (MAP1.Equals (MAP2)); // Die Funktionen von unveränderlich sind die gleichen
In den tatsächlichen Entwicklungsanwendungen ist die Leistung nicht immer die kritischste und wichtigste. Bei gewöhnlichen JavaScript -Projekten ist die Kontrollierbarkeit von Daten, die durch die Merkmale von Unveränderlich hervorgerufen werden, vorteilhafter als die Leistung. Für veränderliche Objekte ist es für die Verwendung in einem geschlossenen Bereich geeignet, während unveränderliche Objekte für die Verwendung geeignet sind, wenn Daten über mehrere Bereiche weitergegeben werden müssen.
Der Unterschied zwischen veränderlich und unveränderlich
Immutable.js bietet eine Vielzahl von abgelegenen Datenstrukturen: einschließlich Listen -Stack Map OrderedMap Set Set SetSet -Datensatz, die ungefähr der nativen mutablen Datenstruktur entsprechen.
Ich werde die Verwendung jeder Datenstruktur hier nicht erklären, sondern hauptsächlich über den Unterschied zwischen der Verwendung unveränderlicher Objekte und veränderlichen Objekte.
Native Mutable -Objekte sind sehr bequem für "Lesen" und "Schreiben".
var MutableObj = {}; // Daten mutableObj.foo = 'bar'; // data console.log (MutableObj.foo);Das unveränderliche Objekt muss die Daten durch Set and Get "lesen" und "schreiben".
var unveränderlichObj1 = unveränderlich.Map (); // Daten schreiben Var unveränderlich. // => 'Bar'
Um die Verwendung der festgelegten Methode zu veranschaulichen, erstellte das obige Beispiel am Anfang ein leeres Objekt und tatsächlich kann der Anfangswert während der Instanziierung übergeben werden.
var unbeabentlicherobj = unveränderlich.Map ({'foo', 'bar'});Für Daten mit tieferen Ebenen ist die von Iminual.js bereitgestellte Zugriffsschnittstelle sehr bequem.
var unveränderlichObj1 = unveränderlich.fromjs ({a: {b: 'c'}, d: [1, 2, 3]}); // Deep Data console.log (unveränderliche OBJ1.getin (['A', 'B']); // => 'c'console.log (unveränderlichObj1.getin ([' a ',' b '])); // => 2 // tiefe data var unveränderlich modifizierenObj2 = unveränderlichObj1.setin (['A', 'B'], 'D'); console.log (unverfälschte OBJ2.getin (['a', 'B'])); // => 'D'Wenn es sich um ein natives veränderliches Objekt handelt, kann ein undefinierter Fehler bei der Zugriff auf eine tiefe Datenebene in einer Kette angegeben werden, während ein unveränderliches Objekt bei der Begegnung dieser Situation keinen Fehler meldet und die Rückgabe undefiniert ist.
Wenn Sie beim Debuggen die interne Struktur eines unveränderlichen Objekts anzeigen möchten, wird empfohlen, Tojson () zuerst in ein normales veränderliches Objekt umzuwandeln.