Veränderlichkeit ist die Fähigkeit, einen Wert zu ändern. Ein veränderlicher Wert kann geändert werden, und ein unveränderlicher Wert kann nicht geändert werden. Ein häufiges Missverständnis besteht darin, dass das Schlüsselwort „const“ eine Variable unveränderlich macht.
Tatsächlich verhindert „const“ nur eine Neuzuweisung. Bei Nicht-Objekttypen können Werte nur durch Neuzuweisung geändert werden, sodass sie durch die Deklaration mit „const“ tatsächlich unveränderlich werden. Betrachten Sie zum Beispiel den folgenden Code:
const num = 5; num = 7; // illegal reassignment of const variable
Es gibt keine Möglichkeit, den Wert von num in diesem Code zu ändern. Beachten Sie, dass die Verwendung von ++ oder -- immer noch als Neuzuweisungen betrachtet wird und dies in der Fehlermeldung angezeigt wird, wenn wir versuchen, sie für eine mit const.
deklarierte Variable zu verwenden
const num = 5; num++;//illegal reassignment of constant
Der resultierende Fehler ist:
Uncaught TypeError: Assignment to constant variable.
Objekte unterscheiden sich hinsichtlich der Veränderlichkeit grundlegend darin, dass sich ihre Werte ändern können, ohne dass die Variable neu zugewiesen werden muss. Beachten Sie, dass die Neuzuweisung von Eigenschaften durch „const“ nicht verhindert wird. Nur die Neuzuweisung des Variablennamens wird verhindert.
const obj = {num: 5}; obj.num = 7; //legal obj = {num: 7}; //illegal reassignment
Objekte können auch Methoden haben, die die internen Werte ändern.
const obj = { num: 5, increment(){ this.num++; } } obj.increment(); console.log(obj.num); //6
Es ist möglich, ein Objekt tatsächlich unveränderlich zu machen, indem man es mit „const“ deklariert und Object.freeze() verwendet.
const obj = {num: 5}; Object.freeze(obj); obj.num = 7; // doesn't change console.log(obj.num);// still 5
Beachten Sie, dass bei Verwendung des strikten Modus der Versuch, den Num-Wert zu ändern, tatsächlich zu einem Absturz mit der folgenden Fehlermeldung führen würde:
Cannot assign to read only property 'num'
Die Verwendung von Object.freeze() ohne „const“ reicht bereits aus, um dieses Objekt unveränderlich zu machen. Der Variablenname wird dadurch jedoch nicht unveränderlich.
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
Was in dieser Version des Codes passiert, ist, dass obj neu zugewiesen wird. freeze() wurde auf das vorherige Objekt mit demselben Namen angewendet, aber das neue Objekt wurde nie eingefroren, sodass es veränderbar ist.
Es gibt Zeiten, in denen Sie vielleicht zulassen möchten, dass sich Werte in einem Objekt ändern, aber das Hinzufügen oder Entfernen von Eigenschaften nicht zulassen möchten. Dies kann durch die Verwendung von Object.seal() erreicht werden.
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
Das Einfrieren und Versiegeln gilt für das gesamte Objekt. Wenn Sie bestimmte Eigenschaften unveränderlich machen möchten, können Sie dies mit defineProperty() oder defineProperties() tun. Die Wahl zwischen diesen beiden hängt davon ab, ob Sie eine einzelne Eigenschaft oder mehrere Eigenschaften beeinflussen möchten.
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
In diesem Beispiel wird eine neue Eigenschaft definiert, aber defineProperty() kann auch für eine vorhandene Eigenschaft verwendet werden. Beachten Sie, dass wenn „configurable“ zuvor auf „false“ gesetzt war, es nicht in „true“ geändert werden kann. Wenn es jedoch ursprünglich „true“ war, kann es auf „false“ gesetzt werden, da diese Änderung als eine Art Konfiguration zählt.
In den meisten Fällen müssen Sie nicht garantieren, dass ein Objekt unveränderlich ist. Wenn ein solcher Bedarf besteht, reicht es im Allgemeinen aus, das Objekt einzufrieren, aber wir haben zusätzliche Optionen für feinere Kontrollen, wenn ein solcher Bedarf besteht.
Das obige ist der detaillierte Inhalt vonObjektveränderlichkeit in Javascript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!