Gibt es eine Möglichkeit, Konstanten in JavaScript zu verwenden ?
Wenn nicht, wie wird üblicherweise Variablen angegeben, die als Konstanten verwendet werden?
javascript
constants
fuentesjr
quelle
quelle
Chrome
Ermöglicht die Verwendung des Schlüsselwortsconst
zur Verwendung von Konstanten. zBconst ASDF = "asdf"
. Daconst
es jedoch nicht mit mehreren Browsern kompatibel ist, halte ich mich normalerweise an einevar
Erklärung.try{const thing=1091;}catch(e){var thing=1091;}
funktioniert.const
odervar
überhaupt?const
es den gleichen Umfang hat wievar
, und das ist Funktionsebene, nicht Blockebene. Wenn Sie stattdessen dem bevorstehenden ECMAScript-Standard folgen,const
hat er den gleichen Umfang wielet
, was bedeutet, dass er nicht funktioniert.Antworten:
Seit ES2015 hat JavaScript eine Vorstellung von
const
:Dies funktioniert in nahezu allen Browsern außer IE 8, 9 und 10 . Für einige muss möglicherweise auch der strikte Modus aktiviert sein.
Sie können
var
Konventionen wie ALL_CAPS verwenden, um zu zeigen, dass bestimmte Werte nicht geändert werden sollten, wenn Sie ältere Browser unterstützen müssen oder mit Legacy-Code arbeiten:quelle
const
Schlüsselwort verwenden können, wenn Sie keine browserübergreifende Kompatibilität benötigen (oder wenn Sie serverseitig in Rhino oder Node.js programmieren) . Es wird derzeit von allen modernen Browsern außer IE unterstützt.Object.defineProperty
schreibgeschützte Eigenschaften erstellen, die auch nicht gelöscht werden können. Dies funktioniert in der aktuellen Version aller gängigen Browser (jedoch falsch in IE8 ). Siehe die Antwort von @NotANameconst
Schlüsselwort ist jetzt offiziell Teil der Sprache und wird von jedem Browser unterstützt. Laut statcounter.com verwenden nur noch wenige Prozent der Internetnutzer alte Browserversionen, die nicht unterstützt wurdenconst
.Versuchen Sie, die Variablen vor Änderungen zu schützen? Wenn ja, können Sie ein Modulmuster verwenden:
Mit diesem Ansatz können die Werte nicht geändert werden. Sie müssen jedoch die Methode get () für CONFIG :( verwenden.
Wenn Sie den Variablenwert nicht streng schützen müssen, gehen Sie einfach wie vorgeschlagen vor und verwenden Sie eine Konvention von ALL CAPS.
quelle
CONFIG.get = someNewFunctionThatBreaksTheCode
... Alles in allem können Sie Konstanten in JS (ohne const-Schlüsselwort) absolut nicht erzwingen. Sie können nur die Sichtbarkeit einschränken.private
ist ein zukünftig reserviertes Wort in JavaScript. Ich würde das nicht verwenden, wenn ich Sie wäre.Das
const
Schlüsselwort befindet sich im Entwurf von ECMAScript 6, wird jedoch bisher nur von wenigen Browsern unterstützt: http://kangax.github.io/compat-table/es6/ . Die Syntax lautet:quelle
const
, werden keine Fehler ausgegeben. Die Zuweisung schlägt einfach fehl und die Konstante hat immer noch ihren ursprünglichen Wert. Dies ist meiner Meinung nach ein großer Konstruktionsfehler, aber solange es eine klare, konsistente Namenskonvention gibt (wie die beliebte ALL_CAPS), denke ich nicht, dass dies zu viel Kummer verursachen würde.'use strict'
.ALL CAPS
?Siehe Object.freeze . Sie können verwenden,
const
wenn Sie dieconstants
Referenz auch schreibgeschützt machen möchten .quelle
i
const
Deklaration, z. B. können Eigenschaften nicht erneut deklariert oder neu zugewiesen werden. Wenn sie jedoch vom Datentyp sindobject
, können sie mutiert werden.const constants
anstelle von verwendenvar constants
, um zu verhindern, dass die Variable neu zugewiesen wird.IE unterstützt Konstanten, z. B.:
quelle
const
) zu handhaben . Können Sie erklären, was daran falsch ist?ECMAScript 5 führt ein
Object.defineProperty
:Es wird in jedem modernen Browser (sowie IE ≥ 9) unterstützt.
Siehe auch: Object.defineProperty in ES5?
quelle
writable: false
wird tatsächlich einen Fehler aus , wenn der Code, der die Zuordnung tut , ist unter strengen Modus ECMAScript 5 des interpretiert wird. Nur ein weiterer Grund,'use strict'
in Ihren Code zu schreiben .writable: false
da dies die Standardeinstellung ist .Nein, im Allgemeinen nicht. Firefox implementiert,
const
aber ich weiß, dass IE dies nicht tut.@John weist auf eine gängige Benennungspraxis für Konstanten hin, die seit Jahren in anderen Sprachen verwendet wird. Ich sehe keinen Grund, warum Sie das nicht verwenden konnten. Das bedeutet natürlich nicht, dass jemand den Wert der Variablen sowieso nicht überschreibt. :) :)
quelle
In JavaScript bevorzuge ich die Verwendung von Funktionen, um konstante Werte zurückzugeben.
quelle
Mozillas MDN-Webdokumente enthalten gute Beispiele und Erklärungen zu
const
. Auszug:Es ist jedoch traurig, dass IE9 / 10 immer noch nicht unterstützt
const
. Und der Grund, warum es absurd ist :Sie implementieren es nicht, weil andere Browser es nicht richtig implementiert haben?! Zu ängstlich, es besser zu machen? Standarddefinitionen oder nicht, eine Konstante ist eine Konstante: einmal gesetzt, nie geändert.
Und zu allen Ideen: Jede Funktion kann überschrieben werden (XSS etc.). Es gibt also keinen Unterschied in
var
oderfunction(){return}
.const
ist die einzige wirkliche Konstante.Update: IE11 unterstützt
const
:quelle
Wenn es Ihnen nichts ausmacht, Funktionen zu verwenden:
Dieser Ansatz bietet Ihnen Funktionen anstelle von regulären Variablen, garantiert jedoch *, dass niemand den Wert ändern kann, sobald er festgelegt ist.
Ich persönlich finde das ziemlich angenehm, besonders nachdem ich mich an dieses Muster von Knockout-Observablen gewöhnt habe.
* Es sei denn, jemand hat die Funktion neu definiert,
constant
bevor Sie sie aufgerufen habenquelle
a = constant(10); a(10); // 10
gefolgt vona = constant(25); a(); //25
, keine Fehler oder Warnungen gegeben, kein Hinweis darauf, dass Ihre Konstante gebrochen wurde.a
ändert sich der Wert in einen neuen WertMit der "neuen" Objekt-API können Sie Folgendes tun:
werfen Sie einen Blick auf diese auf dem Mozilla MDN für weitere Einzelheiten. Es ist keine Variable der ersten Ebene, da sie an ein Objekt angehängt ist. Wenn Sie jedoch einen Bereich haben, können Sie ihn an diesen anhängen.
this
sollte auch funktionieren. Wenn Sie dies beispielsweise im globalen Bereich tun, wird im Fenster ein Pseudokonstantenwert deklariert (was eine wirklich schlechte Idee ist, sollten Sie globale Variablen nicht nachlässig deklarieren).Hinweis: Durch die Zuweisung erhalten Sie den zugewiesenen Wert in der Konsole zurück, der Wert der Variablen ändert sich jedoch nicht
quelle
Gruppieren Sie Konstanten nach Möglichkeit in Strukturen:
Beispiel, in meinem aktuellen Spielprojekt, habe ich unten verwendet:
Zuordnung:
Vergleich:
In jüngerer Zeit verwende ich zum Vergleich:
IE11 ist mit dem neuen ES6-Standard ausgestattet, der über eine 'const'-Deklaration verfügt.
Oben funktioniert in früheren Browsern wie IE8, IE9 und IE10.
quelle
Sie können Ihr Skript problemlos mit einem Mechanismus für Konstanten ausstatten, der festgelegt, aber nicht geändert werden kann. Ein Versuch, sie zu ändern, führt zu einem Fehler.
quelle
Vergiss den IE und benutze das
const
Schlüsselwort.quelle
Es gibt jedoch keine genaue browserübergreifende vordefinierte Methode. Sie können dies erreichen, indem Sie den Umfang der Variablen steuern, wie in anderen Antworten gezeigt.
Aber ich werde vorschlagen, Namensraum zu verwenden, um von anderen Variablen zu unterscheiden. Dadurch wird die Wahrscheinlichkeit einer Kollision mit anderen Variablen auf ein Minimum reduziert.
Richtiger Namespace wie
also während der Verwendung wird es sein
iw_constant.name
oderiw_constant.age
Sie können das Hinzufügen eines neuen Schlüssels oder das Ändern eines Schlüssels in iw_constant mithilfe der Object.freeze-Methode auch blockieren. Es wird jedoch nicht von älteren Browsern unterstützt.
Ex:
Für ältere Browser können Sie die Polyfill- Methode zum Einfrieren verwenden.
Wenn Sie mit dem Aufrufen der Funktion einverstanden sind, ist das Folgende am besten browserübergreifend, um Konstanten zu definieren. Scoping Ihres Objekts innerhalb einer selbstausführenden Funktion und Rückgabe einer get-Funktion für Ihre Konstanten, z.
// um den Wert zu erhalten, benutze
iw_constant('name')
oderiw_constant('age')
** In beiden Beispielen müssen Sie beim Namensabstand sehr vorsichtig sein, damit Ihr Objekt oder Ihre Funktion nicht durch eine andere Bibliothek ersetzt wird. (Wenn das Objekt oder die Funktion selbst ersetzt wird, wird Ihre gesamte Konstante gelöscht.)
quelle
Für eine Weile habe ich "Konstanten" (die eigentlich noch keine Konstanten waren) in Objektliteralen angegeben, die an
with()
Anweisungen übergeben wurden. Ich fand es so klug. Hier ist ein Beispiel:In der Vergangenheit habe ich auch einen
CONST
Namespace erstellt, in den ich alle meine Konstanten eingefügt habe. Wieder mit dem Overhead. Meine Güte.Nun, ich weiß nur
var MY_CONST = 'whatever';
zu KISS .quelle
with
.Meine Meinung (funktioniert nur mit Objekten).
Versuchen! Aber verstehe - das ist ein Objekt, aber keine einfache Variable.
Versuchen Sie auch einfach:
quelle
Ich hatte auch ein Problem damit. Und nachdem ich eine ganze Weile nach der Antwort gesucht und alle Antworten von allen betrachtet habe, denke ich, dass ich eine tragfähige Lösung dafür gefunden habe.
Es scheint, dass die meisten Antworten, auf die ich gestoßen bin, Funktionen zum Halten der Konstanten verwenden. Wie viele Benutzer der VIELEN Foren berichten, können die Funktionen von Benutzern auf der Clientseite leicht überschrieben werden. Ich war fasziniert von Keith Evetts Antwort, dass auf das Konstantenobjekt nicht von außen zugegriffen werden kann, sondern nur von den Funktionen auf der Innenseite.
Also habe ich mir diese Lösung ausgedacht:
Fügen Sie alles in eine anonyme Funktion ein, damit die Variablen, Objekte usw. vom Client nicht geändert werden können. Verstecken Sie auch die "echten" Funktionen, indem andere Funktionen die "echten" Funktionen von innen aufrufen. Ich dachte auch daran, Funktionen zu verwenden, um zu überprüfen, ob eine Funktion von einem Benutzer auf der Clientseite geändert wurde. Wenn die Funktionen geändert wurden, ändern Sie sie mithilfe von Variablen, die innen 'geschützt' sind und nicht geändert werden können.
Es scheint auch, dass Sicherheit wirklich ein Problem ist und es keine Möglichkeit gibt, Ihre Programmierung auf der Clientseite zu "verbergen". Eine gute Idee für mich ist es, Ihren Code so zu komprimieren, dass es für jeden, einschließlich Sie, den Programmierer, wirklich schwierig ist, ihn zu lesen und zu verstehen. Es gibt eine Website, die Sie besuchen können: http://javascriptcompressor.com/ . (Dies ist nicht meine Website, keine Sorge, ich mache keine Werbung.) Auf dieser Website können Sie Javascript-Code kostenlos komprimieren und verschleiern.
quelle
Dies zeigt deutlich die Notwendigkeit eines standardisierten browserübergreifenden const-Schlüsselworts.
Aber für den Moment:
oder
Beides scheint ausreichend zu sein und alles andere ist wie das Schießen einer Fliege mit einer Panzerfaust.
quelle
Ich verwende
const
stattvar
in meinen Greasemonkey-Skripten, aber es liegt daran, dass sie nur unter Firefox ausgeführt werden ... DieNamenskonvention kann in der Tat auch der richtige Weg sein (ich mache beides!).
quelle
In JavaScript bestand meine Praxis darin, Konstanten so weit wie möglich zu vermeiden und stattdessen Zeichenfolgen zu verwenden. Probleme mit Konstanten treten auf, wenn Sie Ihre Konstanten der Außenwelt aussetzen möchten:
Zum Beispiel könnte man die folgende Datums-API implementieren:
Aber es ist viel kürzer und natürlicher, einfach zu schreiben:
Auf diese Weise verhalten sich "Tage" und "Stunden" wirklich wie Konstanten, da Sie von außen nicht ändern können, wie viele Sekunden "Stunden" darstellen. Aber es ist leicht zu überschreiben
MyModule.Date.HOUR
.Diese Art von Ansatz hilft auch beim Debuggen. Wenn Firebug Ihnen sagt, dass
action === 18
es ziemlich schwer ist herauszufinden, was es bedeutet, aber wenn Sie es sehen,action === "save"
ist es sofort klar.quelle
"Hours"
statt"hours"
-, aber eine IDE kann Sie frühzeitig darüber informieren, dass diesDate.Hours
nicht definiert ist.Okay, das ist hässlich, aber es gibt mir eine Konstante in Firefox und Chromium, eine inkonstante Konstante (WTF?) In Safari und Opera und eine Variable in IE.
Natürlich ist eval () böse, aber ohne es gibt IE einen Fehler aus, der die Ausführung von Skripten verhindert.
Safari und Opera unterstützen das Schlüsselwort const, Sie können jedoch den Wert der Konstante ändern .
In diesem Beispiel schreibt serverseitiger Code JavaScript auf die Seite und ersetzt {0} durch einen Wert.
Wofür ist das gut? Nicht viel, da es nicht browserübergreifend ist. Bestenfalls vielleicht ein wenig Ruhe, zumindest einige Browser nicht zulassen, dass Lesezeichen oder Skripte von Drittanbietern den Wert ändern.
Getestet mit Firefox 2, 3, 3.6, 4, Iron 8, Chrome 10, 12, Opera 11, Safari 5, IE 6, 9.
quelle
Wenn es erwähnenswert ist, können Sie Konstanten im Winkel mit definieren
$provide.constant()
quelle
Eine verbesserte Version von Burkes Antwort , mit der Sie
CONFIG.MY_CONST
stattCONFIG.get('MY_CONST')
.Es erfordert IE9 + oder einen echten Webbrowser.
* Die Eigenschaften sind nur dann schreibgeschützt, wenn die Anfangswerte unveränderlich sind.
quelle
JavaScript ES6 hat das
const
Schlüsselwort (neu) eingeführt, das in allen gängigen Browsern unterstützt wird .Abgesehen davon
const
verhält sich ähnlich wielet
.Es verhält sich wie erwartet für primitive Datentypen (Boolean, Null, Undefined, Number, String, Symbol):
Achtung: Beachten Sie die Fallstricke bei Objekten:
Wenn Sie wirklich ein unveränderliches und absolut konstantes Objekt benötigen: Verwenden Sie es einfach
const ALL_CAPS
, um Ihre Absicht klar zu machen. Es istconst
sowieso eine gute Konvention, alle Erklärungen einzuhalten, also verlassen Sie sich einfach darauf.quelle
Eine andere Alternative ist so etwas wie:
Dann einfach:
var foo = constantMap.MY_CONSTANT
Wenn Sie dazu
constantMap.MY_CONSTANT = "bar"
wären, hätte dies keine Auswirkung, da wir versuchen, einen Zuweisungsoperator mit einem Getter zu verwenden, undconstantMap.MY_CONSTANT === "myconstant"
würde daher wahr bleiben.quelle
In Javascript gibt es bereits Konstanten . Sie definieren eine Konstante wie folgt:
Dies kann sich nicht durch Neuzuweisung ändern.
quelle
Das Schlüsselwort 'const' wurde früher vorgeschlagen und jetzt offiziell in ES6 aufgenommen. Mit dem Schlüsselwort const können Sie einen Wert / eine Zeichenfolge übergeben, die als unveränderliche Zeichenfolge fungiert.
quelle
Das Einführen von Konstanten in JavaScript ist bestenfalls ein Hack.
Eine gute Möglichkeit, dauerhafte und global zugängliche Werte in JavaScript zu erstellen, besteht darin, ein Objektliteral mit einigen schreibgeschützten Eigenschaften wie diesen zu deklarieren:
Sie haben alle Ihre Konstanten in einem einzigen "my" -Zubehörobjekt zusammengefasst, in dem Sie nach Ihren gespeicherten Werten oder anderen Elementen suchen können, die Sie möglicherweise dort abgelegt haben. Testen wir nun, ob es funktioniert:
Wie wir sehen können, hat die Eigenschaft "my.constant1" ihren ursprünglichen Wert beibehalten. Sie haben sich einige schöne 'grüne' temporäre Konstanten gemacht ...
Dies schützt Sie jedoch natürlich nur davor, Ihren Wert für die Eigenschaftskonstante versehentlich mit einem direkten Zugriff wie im angegebenen Beispiel zu ändern, zu ändern, aufzuheben oder zu leeren.
Ansonsten denke ich immer noch, dass Konstanten für Dummies sind. Und ich denke immer noch, dass der Austausch Ihrer großen Freiheit gegen eine kleine Ecke trügerischer Sicherheit der schlechteste Handel ist, der möglich ist.
quelle
Rhino.js
Geräteconst
zusätzlich zu dem, was oben erwähnt wurde.quelle