2016-07-05 5 views
2

私が間違っていない場合は、variableの名前が使用しているポインタは変更できませんが、変数pointsは変更される可能性があります。なぜ私の定数が新しい値を指していない

変数名の値が変更されているので、yahooが表示されないはずです。その変化...

const foo = []; 
foo.push("test"); 
console.log(foo); // outputs ["test"] 

私はここで混乱していますが、誰も私にこれを説明することができ

別の例として、。

+0

最初の例は定数に固有のものではありません。プリミティブ文字列がコピーされ、参照が渡されません。後者の場合、参照は変更されず、オブジェクトのプロパティは一定ではなく、参照の 'foo'へのオブジェクトの束縛のみが一定です。定数を持つオブジェクトを得るには、 'const foo = Object.freeze([]);'を使います。簡単に言えば、 'const foo =' ... ';'は、あなたが将来の 'foo =' ... ';'を使うことを防ぎます。 – Xufox

+1

'const'は、' const xs = [1,2]; xs。push(3) '、再割り当て禁止' const ys = [1,2]; ys = [1,2,3] // fails' – ftor

答えて

3

最初の例では不変の文字列を使用し、2番目の例では可変オブジェクトを使用しています。

JS文字列は宣言または作成後に不変です。したがって、foonameの値への参照ではなく、文字列を指しています。あなたは文字列を変更していない、別の文字列を指している。

配列変数はオブジェクトを指し、同じオブジェクトが変更された後もそのオブジェクトを指し続けます。しかし、constは深くないので、あなたはまだ同じオブジェクトを指しています。

これはまた、JS 'constの一般的な誤解を強調しています。これは、C++のconstよりもJavaのfinalのように機能します。 変数は、オブジェクトのインスタンスではなくconstと宣言しているため、変数に再割り当てできないようにするだけで、基礎となるオブジェクトを変更することはできません。 MDNから

2

CONST宣言は、値への読み取り専用の参照を作成します。保持している値が不変であることを意味するものではなく、変数識別子を再割り当てできないということだけではありません。

これは、constに割り当てられた値を変更する配列またはオブジェクトを変更することで言うが、const変数に新しい値を割り当てることができないことを意味します。例えば:

有効

const a = []; 
 
a.push(5); 
 
console.log(a); 
 

 
const b = {}; 
 
b['foo'] = 'bar'; 
 
console.log(b);

無効:これは

const a = []; 
 
a = [5]; 
 
console.log(a); 
 

 
const b = {}; 
 
b = {'foo': 'bar'}; 
 
console.log(b);

エラーがスローされます
関連する問題