Object.freeze()
は、ES6でconst
を使用するための移行の便利な方法のようです。Object.freeze()vs const
どちらもコード内に置かれている場合や、不変のデータを処理するための好ましい方法がある場合はありますか?
を使用する必要がありますか?私がサポートしているすべてのブラウザconst
に切り替えるまで、代わりにconst
を使用しますか?
Object.freeze()
は、ES6でconst
を使用するための移行の便利な方法のようです。Object.freeze()vs const
どちらもコード内に置かれている場合や、不変のデータを処理するための好ましい方法がある場合はありますか?
を使用する必要がありますか?私がサポートしているすべてのブラウザconst
に切り替えるまで、代わりにconst
を使用しますか?
const
およびObject.freeze
は全く異なる2つのものです。
const
は、バインディング( "変数")に適用されます。不変のバインディングを作成します。つまり、バインドに新しい値を割り当てることはできません。
Object.freeze
値に動作し、より具体的には、オブジェクトは値。これはオブジェクトを不変にします。つまり、そのプロパティを変更することはできません。
基本的に 'const'は新しい' var'です。ブロックスコープにすぎず、再割り当てはできません。 'let'を使うことはできますが、実際には、変数が指す値を変更する場合にのみ必要です。ループ制御/イテレータ変数や数字や文字列などの単純な型には意味がありますが、オブジェクト(配列を含む)内容を変更できないオブジェクト/配列が必要な場合は、 'const'で宣言するだけでなく、' Object.freeze() 'も呼び出す必要があります。 –
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
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の機能に従って作成したものです。
私はビルドプロセスで[babeljs](https://babeljs.io/docs/learn-es2015/)を使用することに取り組んだので、主にこれらのような互換性の問題は無視できます。 – spender
いいえ - 彼らは違うことをします。 constは再割り当てを防止します(const x = 1; x = 2はできません)。フリーズは突然変異を防ぎます(例えば、Object.freeze(x); x.a = 2); – joews