2017-11-06 2 views
0

私の質問は簡単ですConstについてです。私はたくさんの場所を見てきましたが、開発者はconstよりもletvarを好んでいましたが、オブジェクトもそのプロパティが変更可能であると宣言しました。誰かがこれを説明できますか?Constはなぜオブジェクト宣言で頻繁に使用されますが、そのプロパティは変更できますか?

const a = {}; 
a.name = ""; 
console.log(a.name); 
+0

'const'は不変な参照を作成するので、他の値を代入することはできません。 'let'は共通参照を作成しますが、スコープにバインドされています(関数外では使用できません)。 –

+0

'const a = {};'は単に 'a'が常に同じオブジェクトになることを意味します。 – Xufox

答えて

0

それは(あなたの例では)a異なる基準を割り当てられることを防止するが、それらは、オブジェクトインスタンスの現在の状態を伝えるように、オブジェクト内の特性はしばしば変更される必要があります。

単純な類推ですが、ここでより正確ですか?

var me = "Scott"; 
const me = "Scott"; 

この場合はどうなりますか?

me = you; 

本当に欲しいのであれば、実際の生活では名前を変更することができます。この場合、meはいつもそして永遠に参照すべきです、まあ、私 - 「Scott」だからconstがより良い宣言です。

しかし、私の生涯にわたって、私の特徴は変わり、いくつかは私のコントロールから外れ、いくつかは私のコントロール下にあります。だから、私たちはmeは、基準が変更されることができるはずないという物体の側面、別のオブジェクトを参照するように変更するme参照したくないながら:あなたはに一定の値を必要に応じて、

const me = {}; 
me.height = "6' 1"; // Used to be 6' 3" back in the day! 

しかし、オブジェクトを保持するためには、コンストラクタ関数内のプライベート変数を宣言してそのことを行うことができます。

function Me(height){ 
    // Some aspects of this object will never change. They can be set up 
    // as private data: 
    const bloodType = "B+"; 

    // Others are just properties: 
    this.height = height; 
} 

オブジェクトリテラルを引き続き使用できますが、読み取り専用になるように特定のプロパティを「ロックダウン」する必要があります。これはObject.definePropertyで行われます。

+0

'Object.freeze'もあります。 – Xufox

+0

@Xufox 'Object.freeze'はオブジェクト内の1つの値をどのように一定にしますか? '.freeze()'はオブジェクト全体をフリーズします。 –

+0

そうです、あなたは "一定の値"であり、 "すべての値は一定"ではありません。もちろん、 'Object.freeze'はすべての値を一定に保ちます。単一のものだけを一定に保つことは、異なって行われるだろう。 – Xufox

1

オブジェクト自体が上書きされたり、型が変更されたりしないようにするだけです。定数は常にオブジェクトになります。

const a = {}; 
a = 'foo'; 
const b = {}; 
b = { foo: 'bar' }; 

両方がスローされます:

Uncaught TypeError: Assignment to constant variable.

0

const宣言MDN

の値に読み取り専用の参照を作成よれ。 ではありません。は保持している値が不変であり、変数識別子を再割り当てできないことを意味します。例えば、コンテンツがオブジェクトである場合、これは、オブジェクトのコンテンツ(例えば、そのパラメータ)が変更可能であることを意味する。

関連する問題