2015-10-14 6 views
41

Object.freeze() scheint wie eine Übergangskomfortmethode in Richtung zu verwenden const in ES6.Object.freeze() vs const

Gibt es Fälle, in denen beide ihren Platz im Code einnehmen oder gibt es einen bevorzugten Weg, mit unveränderlichen Daten zu arbeiten?

Sollte ich Object.freeze() bis zu dem Moment verwenden, in dem alle Browser, mit denen ich arbeite, const verwenden, dann auf const umschalten?

+1

Ich habe [babeljs] (https://babeljs.io/docs/learn-es2015/) in meinem Build-Prozess verwendet, so dass ich Kompatibilitätsprobleme wie diese hauptsächlich ignorieren kann. – spender

+8

Nein - sie machen verschiedene Dinge. const verhindert die Neuzuweisung (z. B. kann nicht const x = 1; x = 2); Einfrieren verhindert eine Mutation (z. B. können Sie nicht Object.freeze (x); x.a = 2); – joews

Antwort

83

const und Object.freeze sind zwei völlig verschiedene Dinge.

const gilt für Bindungen ("Variablen"). Es erzeugt eine unveränderbare Bindung, d.h. Sie können der Bindung keinen neuen Wert zuweisen.

Object.freeze Arbeiten auf Werte, und insbesondere Objektwerte. Dadurch wird ein Objekt unveränderlich, d. H. Sie können seine Eigenschaften nicht ändern.

+1

Grundsätzlich ist 'const' das neue' var'; Es ist nur Block-Bereich und verhindert Neuzuweisung. Sie können 'let' verwenden, müssen es aber nur, wenn Sie den Wert ändern wollen, auf den eine Variable zeigt, was für Schleifensteuerungs-/Iteratorvariablen und einfache Typen wie Zahlen und Strings Sinn macht, aber nicht für die meisten Anwendungen von Objekte (einschließlich Arrays). Wenn Sie ein Objekt/Array haben wollen, dessen Inhalt nicht geändert werden kann, dann sollten Sie es neben 'const' auch mit' Object.freeze() 'aufrufen. –

33

In ES5 Object.freeze funktioniert nicht auf Primitiven, die wahrscheinlich häufiger mit const als Objekte deklariert werden würde. Sie können Grundelemente in ES6 einfrieren, aber Sie haben auch Unterstützung für const.

Auf der anderen Seite const verwendet, um Objekte zu deklarieren "friert" sie nicht ein, Sie können nur nicht das ganze Objekt neu deklarieren, aber Sie können seine Schlüssel frei ändern. Auf der anderen Seite können Sie eingefrorene Objekte neu deklarieren.

Object.freeze ist auch flach, also müssen Sie es rekursiv auf verschachtelte Objekte anwenden, um sie zu schützen.

var ob1 = { 
    foo : 1, 
    bar : { 
     value : 2 
    } 
}; 
Object.freeze(ob1); 

const ob2 = { 
    foo : 1, 
    bar : { 
     value : 2 
    } 
} 

ob1.foo = 4; // (frozen) ob1.foo not modified 
ob2.foo = 4; // (const) ob2.foo modified 

ob1.bar.value = 4; // (frozen) modified, because ob1.bar is nested 
ob2.bar.value = 4; // (const) modified 

ob1.bar = 4; // (frozen) not modified, bar is a key of obj1 
ob2.bar = 4; // (const) modified 

ob1 = {}; // (frozen) ob1 redeclared 
ob2 = {}; // (const) ob2 not redeclared 
4
var obj = { 
    a: 1, 
    b: 2 
}; 
Object.freeze(obj); 
obj.newField = 3; // You can't assign new field , or change current fields 

Das obige Beispiel es Ihr Objekt unveränderlich vollständig macht.

Schauen wir folgendes Beispiel.

const obj = { 
    a: 1, 
    b: 2 
}; 
obj.a = 13; // You can change a field 
obj.newField = 3; // You can assign new field. 

Es wird keinen Fehler geben.

Aber wenn Sie das versuchen, wie

const obj = { 
     a: 1, 
     b: 2 
    }; 
obj = { 
t:4 
}; 

Es wird ein Fehler, wie die „obj ist schreibgeschützt“ werfen.

Ein weiterer Anwendungsfall

const obj = {a:1}; 
var obj = 3; 

Es Duplicate declaration "obj"

Auch nach mozilla docs const Erklärung

Die const Deklaration erstellt eine schreibgeschützte Verweis auf einen Wert werfen. Es bedeutet nicht, dass der Wert, den es enthält, unveränderlich ist, nur dass die Variablenkennung nicht neu zugewiesen werden kann.

Diese Beispiele wurden nach babeljs ES6 erstellt.

Verwandte Themen