2015-10-14 9 views
41

Object.freeze() sembra un metodo di transizione per spostarsi verso l'utilizzo di const in ES6.Object.freeze() vs const

Ci sono casi in cui entrambi prendono il loro posto nel codice o esiste un modo preferito per lavorare con dati immutabili?

Dovrei usare Object.freeze() fino al momento in cui tutti i browser con cui lavoro con il supporto const poi passare ad usare const invece?

+1

Ho iniziato a utilizzare [babeljs] (https://babeljs.io/docs/learn-es2015/) nel mio processo di compilazione in modo da ignorare principalmente problemi di compatibilità come questi. – spender

+8

No - fanno cose diverse. const impedisce la riassegnazione (ad esempio non puoi const x = 1; x = 2); il blocco impedisce la mutazione (ad esempio non è possibile Object.freeze (x); x.a = 2); – joews

risposta

83

const e Object.freeze sono due cose completamente diverse.

const si applica a associazioni ("variabili"). Crea un legame immutabile, cioè non puoi assegnare un nuovo valore al legame.

Object.freeze opere valori, e più specificamente, oggetto valori. Rende un oggetto immutabile, cioè non puoi cambiarne le proprietà.

+1

Fondamentalmente, 'const' è il nuovo' var'; è solo a livello di blocco e impedisce la riassegnazione. Puoi usare 'let', ma in realtà è necessario solo se cambierai il valore a cui punta una variabile, il che ha senso per variabili di controllo/iteratore del ciclo e tipi semplici come numeri e stringhe, ma non per la maggior parte degli usi di oggetti (inclusi gli array). Se vuoi un oggetto/array il cui contenuto non può essere modificato, oltre a dichiararlo con 'const' devi anche chiamare' Object.freeze() '. –

33

In ES5 Object.freeze non funziona su primitive, che verrebbero probabilmente dichiarate più comunemente utilizzando const rispetto agli oggetti. Puoi bloccare i primitivi in ​​ES6, ma hai anche il supporto per const.

D'altra parte const utilizzato per dichiarare oggetti non li "blocca", non è possibile ridichiarare l'intero oggetto, ma è possibile modificarne liberamente le chiavi. D'altra parte è possibile ridichiarare oggetti congelati.

Object.freeze è anche superficiale, quindi è necessario applicarlo in modo ricorsivo su oggetti nidificati per proteggerli.

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 

L'esempio di cui sopra rende completamente il vostro oggetto immutabile.

Consente di guardare l'esempio seguente.

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

Non darà alcun errore.

ma se si prova come quella

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

Si genera un errore del genere "obj è di sola lettura".

Un altro caso d'uso

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

Si getterà Duplicate declaration "obj"

Sempre secondo documenti Mozilla const spiegazione

La dichiarazione const crea un riferimento di sola lettura per un valore. E ' non significa che il valore che detiene è immutabile, solo che l'identificatore di variabile non può essere riassegnato.

Questi esempi creati in base alle funzioni ES6 di babeljs.