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 ist, 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 -- weiterhin 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. Lediglich 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. Allerdings wird der Variablenname dadurch 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. Die Funktion „freeze()“ wurde auf das vorherige Objekt mit demselben Namen angewendet, das neue Objekt wurde jedoch nie eingefroren, sodass es veränderbar ist.
Es gibt Zeiten, in denen Sie möglicherweise zulassen möchten, dass sich Werte in einem Objekt ändern, das Hinzufügen oder Entfernen von Eigenschaften jedoch 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 von 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.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3