2015-10-14 15 views
41

Object.freeze()は、ES6でconstを使用するための移行の便利な方法のようです。Object.freeze()vs const

どちらもコード内に置かれている場合や、不変のデータを処理するための好ましい方法がある場合はありますか?

を使用する必要がありますか?私がサポートしているすべてのブラウザconstに切り替えるまで、代わりにconstを使用しますか?

+1

私はビルドプロセスで[babeljs](https://babeljs.io/docs/learn-es2015/)を使用することに取り組んだので、主にこれらのような互換性の問題は無視できます。 – spender

+8

いいえ - 彼らは違うことをします。 constは再割り当てを防止します(const x = 1; x = 2はできません)。フリーズは突然変異を防ぎます(例えば、Object.freeze(x); x.a = 2); – joews

答えて

83

constおよびObject.freezeは全く異なる2つのものです。

constは、バインディング( "変数")に適用されます。不変のバインディングを作成します。つまり、バインドに新しい値を割り当てることはできません。

Object.freezeに動作し、より具体的には、オブジェクトは値。これはオブジェクトを不変にします。つまり、そのプロパティを変更することはできません。

+1

基本的に 'const'は新しい' var'です。ブロックスコープにすぎず、再割り当てはできません。 'let'を使うことはできますが、実際には、変数が指す値を変更する場合にのみ必要です。ループ制御/イテレータ変数や数字や文字列などの単純な型には意味がありますが、オブジェクト(配列を含む)内容を変更できないオブジェクト/配列が必要な場合は、 'const'で宣言するだけでなく、' Object.freeze() 'も呼び出す必要があります。 –

33

ES5 Object.freezeではプリミティブでは機能しません。これはおそらくオブジェクトよりもconstを使用してより一般的に宣言されます。 ES6でプリミティブをフリーズできますが、constもサポートされています。

一方、オブジェクトを宣言するために使用されるconstはオブジェクトを「フリーズ」しないので、オブジェクト全体を再宣言することはできませんが、そのキーを自由に変更することができます。一方、フリーズしたオブジェクトは再宣言できます。

Object.freezeも浅いので、保護するためにネストしたオブジェクトに再帰的に適用する必要があります。

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 

それは完全にあなたのオブジェクトは不変になり、上記の例。

以下の例をご覧ください。

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

これは誤りです。

しかし、あなたはその

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

ようにしようとした場合には、「OBJが読み取り専用である」というようなエラーがスローされます。

また、Mozillaのドキュメントconst説明CONST宣言値に読み取り専用の参照を作成

に従ってDuplicate declaration "obj"

をスローし

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

別のユースケース。 は、保持する値がであることを意味するものではなく、 変数識別子を再割り当てできないことを意味します。

この例は、babeljs ES6の機能に従って作成したものです。

関連する問題