Ich weiß, dass ES6 noch nicht standardisiert ist, aber viele Browser unterstützen derzeit const
Schlüsselwörter in JS.
In der Spezifikation steht geschrieben, dass:
Der Wert einer Konstante kann sich durch Neuzuweisung nicht ändern, und eine Konstante kann nicht erneut deklariert werden. Obwohl es möglich ist, eine Konstante zu deklarieren, ohne sie zu initialisieren, wäre dies aus diesem Grund nutzlos.
und wenn ich so etwas mache:
const xxx = 6;
xxx = 999;
xxx++;
const yyy = [];
yyy = 'string';
yyy = [15, 'a'];
Ich sehe , dass alles in Ordnung ist xxx
immer noch 6
und yyy
ist []
.
In diesem Fall yyy.push(6); yyy.push(1);
wurde mein konstantes Array geändert. Im Moment ist es so [6, 1]
und übrigens kann ich es immer noch nicht ändern yyy = 1;
.
Ich das ein Fehler, oder vermisse ich etwas? Ich habe es in der neuesten Chrom und FF29 versucht
quelle
Antworten:
In der Dokumentation heißt es:
Wenn Sie einem Array oder Objekt etwas hinzufügen, das Sie nicht neu zuweisen oder deklarieren, wird die Konstante bereits deklariert und zugewiesen. Sie fügen lediglich die "Liste" hinzu, auf die die Konstante zeigt.
Das funktioniert also gut:
und das:
aber keines von diesen:
quelle
Dies geschieht, weil Ihre Konstante tatsächlich einen Verweis auf das Array speichert . Wenn Sie etwas in Ihr Array einfügen, ändern Sie nicht Ihren konstanten Wert, sondern das Array, auf das es zeigt. Das gleiche würde passieren, wenn Sie einer Konstante ein Objekt zuweisen und versuchen, eine Eigenschaft davon zu ändern.
Wenn Sie ein Array oder Objekt einfrieren möchten, damit es nicht geändert werden kann, können Sie die
Object.freeze
Methode verwenden, die bereits Teil von ECMAScript 5 ist.quelle
five
auf 5 gesetzte Konstante nicht den Wert 5, sondern nur einen Verweis auf die Zahl 5. Wenn ich das tue,five++
ändere ich nicht die Konstante, sondern nur die Zahl, auf die sie zeigt.five
zeigt (die Variable warfive
früher eine Bezeichnung für die Nummer 5, jetzt zeigt sie auf eine andere Nummer: 6). Verweist im Beispiel in der Frage (und dieser Antwort)x
immer auf dieselbe Liste. Wennx
es sich um const handelt, können Sie nicht auf eine andere Liste verweisen. Der einzige Unterschied besteht darin, dass dieselbe Liste wachsen oder schrumpfen kann. Dies ist nur für Arrays und Objekte möglich und nicht für Grundelemente.Dies ist ein konsistentes Verhalten mit jeder Programmiersprache, die mir einfällt.
Betrachten Sie C - Arrays sind nur verherrlichte Zeiger. Ein konstantes Array bedeutet nur, dass sich der Wert des Zeigers nicht ändert - aber tatsächlich sind die an dieser Adresse enthaltenen Daten frei für.
In Javascript dürfen Sie Methoden für konstante Objekte aufrufen (natürlich - sonst würden konstante Objekte nicht viel Sinn machen!). Diese Methoden können den Nebeneffekt haben, das Objekt zu ändern. Da Arrays in Javascript Objekte sind, gilt dieses Verhalten auch für sie.
Sie können sich nur darauf verlassen, dass die Konstante immer auf dasselbe Objekt zeigt. Die Eigenschaften des Objekts selbst können sich frei ändern.
quelle
Ein weiterer wichtiger Hinweis:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
quelle
Ich denke, dies würde Ihnen mehr Klarheit in Bezug auf das Problem geben: https://codeburst.io/explaining-value-vs-reference-in-javascript-647a975e12a0 .
Im Grunde läuft es darauf hinaus,
const
immer auf dieselbe Adresse im Speicher zu zeigen. Sie können den in dieser Adresse gespeicherten Wert ändern, aber auch nicht die Adresse, auf die auch gezeigtconst
wird.Die von
const
Ihnen erwähnte Definition gilt, wenn dieconst
auf eine Adresse zeigt, die einen primitiven Wert enthält. Dies liegt daran, dass Sie diesem Wert keinen Wert zuweisen können,const
ohne seine Adresse zu ändern (da das Zuweisen primitiver Werte auf diese Weise funktioniert) und das Ändern der Adresse von aconst
nicht zulässig ist.Wenn der
const
Wert auf einen nicht primitiven Wert zeigt, kann der Wert der Adresse bearbeitet werden.quelle
Kam durch diesen Artikel, als ich suchte, warum ich ein Objekt aktualisieren konnte, obwohl ich es als definiert hatte
const
. Der Punkt hier ist also, dass nicht das Objekt direkt, sondern die darin enthaltenen Attribute aktualisiert werden können.Zum Beispiel sieht mein Objekt so aus:
Die obigen Antworten haben richtig darauf hingewiesen, dass es das Objekt ist, das const ist und nicht sein Attribut. Daher kann ich die ID oder den Namen folgendermaßen aktualisieren:
Ich kann das Objekt jedoch nicht wie folgt aktualisieren:
quelle
Da Sie in const die Werte eines Objekts ändern können, speichert das Objekt die Zuordnungsdaten nicht tatsächlich, sondern zeigt darauf. Daher gibt es in Javascript einen Unterschied zwischen Grundelementen und Objekten.
quelle