ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript におけるオブジェクトの可変性

JavaScript におけるオブジェクトの可変性

王林
王林オリジナル
2024-07-20 07:44:38984ブラウズ

Object Mutability in 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」によって妨げられないことに注意してください。変数名のみ再代入が禁止されます。

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。