2016-06-15 3 views
0

javascript定数でこの動作に気付いた... constキーワードは、オブジェクトを扱うときに不変性を失うようです。JavaScriptの一定の動作ですか?

この現象に関するご意見はありますか?

const fruits = 'banana'; 
fruit = 'apple'; 
console.log(fruit); // 'banana' as expected 

//---------------------------------------------------------------------- 

const fruit = ['apple']; 
fruit.push('banana'); 
console.log(fruit); // ['apple', 'banana'] ??????? 

fruit = 'anything'; 
console.log(fruit); // ['apple', 'banana'] as expected; 

//---------------------------------------------------------------------- 

const brands = {}; 
brands = []; 
console.log(brands); // {} as expected 

brands.sony = "playstation" 
console.log(brands); // {sony:'playstation'} ??????? 
+4

MDNから: 'const宣言は値への読み取り専用参照を作成します。それが保持している値が不変であることを意味するものではなく、単に変数識別子を再割り当てできないということです。それは役に立ちますか? – Mjh

+0

質問をする前に[質問]をお読みください。そのページの最初の見出しは「検索と研究」です。これはすでにインターネット上の多くの場所でカバーされています。 –

+0

あなたはどのブラウザを使用していますか? – ISONecroMAn

答えて

1

Object.freezeObject.sealは、あなたが探している機能を紹介します。どちらの方法でも、新しいプロパティが追加されたり、既存のプロパティが削除されたり、既存のプロパティが編集中のものになるのを防ぐことができます。

たとえば、ファイルの先頭に大きなモジュールまたは名前空間を宣言するときは、私はconstの現在の使用が好きです。あなたがまだやりとりすることを可能にしながら、全体のロットが上書きされるのを少し防御するだけです。

+1

* const *はそれほど大きな助けにはなりません。上書きしようとすると何かが上書きしようとすると、上書きに依存していたものは失敗します。いずれの場合も、テストで問題を検出する必要があります。 – RobG

+0

@RobGあなたはテストに巻き込まれるはずですが、誰もがテストに関するベストプラクティスに従ったチームに恵まれているわけではありません!また、エラーが直ちに明らかでない場合、開発者はエラーを発見するまでに多くの時間を費やす可能性があります。「var」ではなく「const」を使用すると何も費用がかかりません。 – Jess

3

Java定数としてのJavascript定数は不変です。しかし、それらを値の指針とみなさなければなりません。彼らは常に同じ値を参照します。その値はプリミティブなものでもオブジェクトのものでもかまいません。したがって、別のオブジェクトへの参照を変更することはできませんが、そのオブジェクトを変更することができます(変更可能な場合、プリミティブ型は変更されません)。

const TEST={ name: 'myObject'} 
TEST= ... // this always does nothing, the current reference cannot be changed 
TEST.name=... //this changes the state of the current reference. 

@Jessの回答は、オブジェクトを変更不可能にする方法を提供します。

関連する問題