Object.freeze()
scheint eine vorübergehende Bequemlichkeitsmethode für die Verwendung const
in ES6 zu sein.
Gibt es Fälle, in denen beide ihren Platz im Code einnehmen, oder gibt es eine bevorzugte Methode, um mit unveränderlichen Daten zu arbeiten?
Sollte ich Object.freeze()
bis zu dem Moment alle Browser verwenden, mit denen ich unterstütze const
, und const
stattdessen auf die Verwendung wechseln ?
javascript
ecmascript-6
Sergei Basharov
quelle
quelle
Object.isFrozen
aber sie sind auch ihre eigenen primitiven Datentyp ...)Antworten:
const
undObject.freeze
sind zwei völlig verschiedene Dinge.const
gilt für Bindungen ("Variablen"). Es wird eine unveränderliche Bindung erstellt, dh Sie können der Bindung keinen neuen Wert zuweisen.Object.freeze
arbeitet mit Werten und insbesondere mit Objektwerten . Es macht ein Objekt unveränderlich, dh Sie können seine Eigenschaften nicht ändern.quelle
const
ist das neuevar
; Es ist nur blockbezogen und verhindert eine Neuzuweisung. Sie können verwendenlet
, müssen dies aber nur, wenn Sie den Wert ändern möchten, auf den eine Variable zeigt. Dies ist sinnvoll für Schleifensteuerungs- / Iteratorvariablen und einfache Typen wie Zahlen und Zeichenfolgen, jedoch nicht für die meisten Verwendungen von Objekten (einschließlich Arrays). Wenn Sie ein Objekt / Array möchten, dessen Inhalt nicht geändert werdenconst
kann, sollten Sie es nicht nur mit deklarieren, sondern auch aufrufenObject.freeze()
.const
ist NICHT das Neuevar
,let
ist das Neuevar
In ES5
Object.freeze
funktioniert dies nicht mit Grundelementen , die wahrscheinlich häufigerconst
als Objekte deklariert werden . Sie können Grundelemente in ES6 einfrieren, haben dann aber auch Unterstützung fürconst
.const
Wenn Sie dagegen Objekte deklarieren, werden sie nicht "eingefroren". Sie können einfach nicht das gesamte Objekt neu deklarieren, sondern die Schlüssel frei ändern. Auf der anderen Seite können Sie eingefrorene Objekte neu deklarieren.Object.freeze
ist auch flach, sodass Sie es rekursiv auf verschachtelte Objekte anwenden müssen, um sie zu schützen.quelle
ob1.bar.value = 4; // (frozen) modified, because ob1.bar is nested
: Liegt es am Umfang der Methode?Zusammenfassung:
const
undObject.freeze()
dienen ganz anderen Zwecken.const
dient zum Deklarieren einer Variablen, die sofort zugewiesen werden muss und nicht neu zugewiesen werden kann. Variablen, die von deklariert wurden,const
haben einen Blockbereich und funktionieren nicht wie Variablen, die mit deklariert wurdenvar
Object.freeze()
ist eine Methode, die ein Objekt akzeptiert und dasselbe Objekt zurückgibt. Jetzt kann das Objekt keine seiner Eigenschaften entfernen oder neue Eigenschaften hinzufügen.Beispiele
const
:Beispiel 1: Kann nicht neu zugewiesen werden
const
Der folgende Code löst einen Fehler aus, da wir versuchen, die Variable foo, die mit dem
const
Schlüsselwort deklariert wurde, neu zuzuweisen. Wir können sie nicht neu zuweisen.Beispiel 2: Zugeordnete Datenstrukturen
const
können mutiert werdenIn diesem Beispiel deklarieren wir eine Variable mit dem
const
Schlüsselwort und weisen ihr ein Objekt zu. Obwohl wir dieser Variablen namens object nicht neu zuweisen können, können wir das Objekt selbst mutieren. Wenn wir vorhandene Eigenschaften ändern oder neue Eigenschaften hinzufügen, hat dies Auswirkungen. Um Änderungen am Objekt zu deaktivieren, benötigen wirObject.freeze()
.Beispiele
Object.freeze()
:Beispiel 1: Ein eingefrorenes Objekt kann nicht mutiert werden
In diesem Beispiel
Object.freeze()
gibtobject1
die Funktion beim Aufrufen und Angeben als Argument das Objekt zurück, das jetzt 'eingefroren' ist. Wenn wir die Referenz des neuen Objekts mit dem===
Operator mit dem alten Objekt vergleichen, können wir feststellen, dass sie sich auf dasselbe Objekt beziehen. Auch wenn wir versuchen, Eigenschaften hinzuzufügen oder zu entfernen, können wir feststellen, dass dies keine Auswirkungen hat (wird im strengen Modus einen Fehler auslösen).Beispiel 2: Objekte mit Referenzen werden nicht vollständig eingefroren
Dieses Beispiel zeigt, dass die Eigenschaften verschachtelter Objekte (und anderer Referenzdatenstrukturen) weiterhin veränderbar sind . Also
Object.freeze()
nicht vollständig ‚einfrieren‘ das Objekt , wenn es Eigenschaften aufweist , die Referenzen sind (zum Beispiel Arrays, Objekte).quelle
Das obige Beispiel macht Ihr Objekt vollständig unveränderlich.
Schauen wir uns folgendes Beispiel an.
Es wird kein Fehler ausgegeben.
Aber wenn du es so versuchst
Es wird ein Fehler wie der folgende ausgegeben: "obj ist schreibgeschützt".
Ein weiterer Anwendungsfall
Es wird werfen
Duplicate declaration "obj"
Auch nach Mozilla Docs const Erklärung
Diese Beispiele wurden gemäß den ES6-Funktionen von babeljs erstellt.
quelle
Sei einfach.
Sie sind anders. Überprüfen Sie die Kommentare zum Code, die jeden Fall erklären.
Const
- Es ist eine Blockbereichsvariable wielet
, deren Wert nicht neu zugewiesen werden kann, neu deklariert.Das bedeutet
Das ganze Verständnis ist, dass const ein Blockbereich ist und sein Wert nicht neu zugewiesen wird.
Object.freeze
: Die Eigenschaften des Objektstamms sind unveränderlich. Außerdem können wir keine weiteren Eigenschaften hinzufügen und löschen, aber wir können das gesamte Objekt erneut zuweisen.// Eine Sache, die in beiden ähnlich ist, ist, dass verschachtelte Objekte veränderbar sind
Vielen Dank.
quelle