ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript におけるオブジェクトの可変性
可変性とは、値を変更する能力です。可変値は変更できますが、不変値は変更できません。 よくある誤解は、「const」キーワードにより変数が不変になるというものです。
実際には、「const」は再代入を防ぐだけです。非オブジェクト型の場合、値は再割り当てによってのみ変更できるため、「const」で宣言すると実際には値は不変になります。 たとえば、次のコードを考えてみましょう:
const num = 5; num = 7; // illegal reassignment of const variable
このコードでは num の値を変更する方法はありません。 ++ または -- の使用は依然として再代入とみなされ、const.
で宣言された変数でこれらを使用しようとすると、エラー メッセージにそのことが示されることに注意してください。
const num = 5; num++;//illegal reassignment of constant
結果として生じるエラーは次のとおりです:
Uncaught TypeError: Assignment to constant variable.
オブジェクトは、変数を再代入せずに値を変更できるという点で、可変性という点で根本的に異なります。プロパティの再割り当ては「const」によって妨げられないことに注意してください。変数名のみ再代入が禁止されます。
const obj = {num: 5}; obj.num = 7; //legal obj = {num: 7}; //illegal reassignment
オブジェクトには、内部値を変更するメソッドを含めることもできます。
const obj = { num: 5, increment(){ this.num++; } } obj.increment(); console.log(obj.num); //6
「const」で宣言し、Object.freeze() を使用することで、オブジェクトを実際に不変にすることができます。
const obj = {num: 5}; Object.freeze(obj); obj.num = 7; // doesn't change console.log(obj.num);// still 5
厳密モードを使用する場合、num 値を変更しようとすると、実際にはクラッシュが発生し、次のエラー メッセージが表示されることに注意してください。
Cannot assign to read only property 'num'
「const」なしで Object.freeze() を使用すると、このオブジェクトを不変にするのに十分です。ただし、変数名が不変になるわけではありません。
let obj = {num: 5}; Object.freeze(obj); obj = {num: 5}; // new object with old name obj.num = 7; // changes successfully console.log(obj.num);// 7
このバージョンのコードでは、obj が再割り当てされます。 ize() は同じ名前を共有する前のオブジェクトに適用されましたが、新しいオブジェクトは凍結されていないため、変更可能です。
オブジェクト内の値の変更は許可したいが、プロパティの追加や削除は許可したくない場合があります。 これは、Object.seal().
を使用して実現できます。
let obj = {num: 5}; Object.seal(obj); obj.num = 7; // changes console.log(obj.num);// 7 obj.newValue = 42; //cannot add new property to sealed object console.log(obj.newValue);//undefined delete obj.num; //cannot delete property from sealed object console.log(obj.num);// still exists and is 7
凍結と封印はオブジェクト全体に適用されます。特定のプロパティを不変にしたい場合は、defineProperty() または defineProperties() を使用して行うことができます。これら 2 つのどちらを選択するかは、単一のプロパティに影響を与えるか、複数のプロパティに影響を与えるかによって決まります。
const obj = {}; Object.defineProperty(obj, 'num',{ value: 5, writable: false, configurable: false }); obj.num = 7; // Cannot change value because writable is false delete obj.num; // Cannot delete because configurable is false console.log(obj.num);//Still exists and is 5
この例では新しいプロパティが定義されていますが、defineProperty() は既存のプロパティでも使用できます。 「configurable」が以前に false に設定されていた場合、true に変更することはできませんが、元々 true であった場合は、この変更は構成の一種としてカウントされるため、false に設定できることに注意してください。
ほとんどの場合、オブジェクトが不変であることを保証する必要はありません。このような必要性が生じた場合、通常はオブジェクトをフリーズするだけで十分ですが、そのような必要性が生じた場合には、より詳細に制御するための追加オプションがあります。
以上がJavaScript におけるオブジェクトの可変性の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。