Existe-t-il un moyen d'utiliser des constantes en JavaScript ?
Sinon, quelle est la pratique courante pour spécifier les variables utilisées comme constantes?
javascript
constants
fuentesjr
la source
la source
Chrome
vous permet d'utiliser le mot-cléconst
pour utiliser des constantes. par exempleconst ASDF = "asdf"
. Cependant, comme ilconst
n'est pas compatible avec plusieurs navigateurs, je m'en tiens généralement à unevar
déclaration.try{const thing=1091;}catch(e){var thing=1091;}
travaux.const
ou pasvar
du tout?const
a la même portée quevar
, et c'est au niveau de la fonction, pas au niveau du bloc. Si vous suivez la prochaine norme ECMAScript à la place,const
a la même portée quelet
, ce qui signifie qu'elle ne fonctionnera pas.Réponses:
Depuis ES2015 , JavaScript a une notion de
const
:Cela fonctionnera dans à peu près tous les navigateurs sauf IE 8, 9 et 10 . Certains peuvent également nécessiter un mode strict activé.
Vous pouvez utiliser
var
des conventions comme ALL_CAPS pour montrer que certaines valeurs ne doivent pas être modifiées si vous devez prendre en charge des navigateurs plus anciens ou si vous travaillez avec du code hérité:la source
const
mot - clé. Il est actuellement pris en charge par tous les navigateurs modernes, à l'exception d'IE.Object.defineProperty
pour créer des propriétés en lecture seule qui ne peuvent pas non plus être supprimées. Cela fonctionne dans la version actuelle de tous les principaux navigateurs (mais de manière incorrecte dans IE8 ). Voir la réponse par @NotANameconst
mot-clé fait désormais officiellement partie de la langue et est pris en charge par tous les navigateurs. Selon statcounter.com, seuls quelques pour cent des internautes utilisent encore d'anciennes versions de navigateur qui ne prenaient pas en chargeconst
.Essayez-vous de protéger les variables contre les modifications? Si oui, alors vous pouvez utiliser un modèle de module:
En utilisant cette approche, les valeurs ne peuvent pas être modifiées. Mais, vous devez utiliser la méthode get () sur CONFIG :(.
Si vous n'avez pas besoin de protéger strictement la valeur des variables, alors faites comme suggéré et utilisez une convention de TOUS LES CAPS.
la source
CONFIG.get = someNewFunctionThatBreaksTheCode
... Dans l'ensemble, vous ne pouvez absolument pas appliquer de constantes dans JS (sans mot-clé const). La seule chose que vous pouvez faire est de limiter la visibilité.private
c'est un futur mot réservé en JavaScript, je ne l'utiliserais pas si j'étais vous.Le
const
mot-clé se trouve dans le projet ECMAScript 6, mais il ne bénéficie pour l'instant que d'une prise en charge limitée du navigateur: http://kangax.github.io/compat-table/es6/ . La syntaxe est:la source
const
, cela ne génère aucune erreur. L'affectation échoue et la constante a toujours sa valeur d'origine. Il s'agit d'un défaut de conception majeur à mon humble avis, mais tant qu'il existe une convention de dénomination claire et cohérente (comme la populaire ALL_CAPS), je ne pense pas que cela causerait trop de chagrin.'use strict'
.ALL CAPS
?Voir Object.freeze . Vous pouvez également l' utiliser
const
si vous souhaitez rendre laconstants
référence en lecture seule.la source
i
const
déclaration ES6 , par exemple, les propriétés ne peuvent pas être déclarées ou réaffectées, mais si elles sont de type de donnéesobject
, elles peuvent être mutées.const constants
au lieu devar constants
pour empêcher la réaffectation de la variable.IE prend en charge les constantes, par exemple:
la source
const
). Pouvez-vous expliquer ce qui ne va pas?ECMAScript 5 présente
Object.defineProperty
:Il est pris en charge dans tous les navigateurs modernes (ainsi que IE ≥ 9).
Voir aussi: Object.defineProperty dans ES5?
la source
writable: false
génèrerait en fait une erreur si le code qui effectue l'affectation est interprété sous le mode strict d'ECMAScript 5. Juste une autre raison d'écrire'use strict'
dans votre code.writable: false
puisque c'est la valeur par défaut .Non, pas en général. Firefox implémente
const
mais je sais qu'IE ne fonctionne pas.@John pointe vers une pratique de dénomination commune pour les consts qui est utilisée depuis des années dans d'autres langues, je ne vois aucune raison pour laquelle vous ne pourriez pas l'utiliser. Bien sûr, cela ne signifie pas que quelqu'un n'écrira pas de toute façon la valeur de la variable. :)
la source
En JavaScript, ma préférence est d'utiliser des fonctions pour renvoyer des valeurs constantes.
la source
Les documents Web Mozillas MDN contiennent de bons exemples et des explications sur
const
. Extrait:Mais il est triste que IE9 / 10 ne prenne toujours pas en charge
const
. Et la raison pour laquelle c'est absurde :Ils ne l'implémentent pas parce que d'autres navigateurs ne l'ont pas implémenté correctement?! Vous avez trop peur de l'améliorer? Définitions de normes ou non, une constante est une constante: définie une fois, jamais modifiée.
Et à toutes les idées: chaque fonction peut être écrasée (XSS etc.). Il n'y a donc pas de différence dans
var
oufunction(){return}
.const
est la seule vraie constante.Mise à jour: IE11 prend en charge
const
:la source
Si cela ne vous dérange pas d'utiliser des fonctions:
Cette approche vous donne des fonctions au lieu de variables régulières, mais elle garantit * que personne ne peut modifier la valeur une fois qu'elle est définie.
Personnellement, je trouve cela plutôt agréable, surtout après s'être habitué à ce modèle des observables à élimination directe.
* Sauf si quelqu'un a redéfini la fonction
constant
avant de l'appelerla source
a = constant(10); a(10); // 10
suivi dea = constant(25); a(); //25
, aucune erreur ou avertissement donné, aucune indication que votre constante a été cassée.a
ensuite les changements de valeur aux nouveauxavec la "nouvelle" API d'objet, vous pouvez faire quelque chose comme ceci:
jetez un oeil à cela sur le MDN Mozilla pour plus de détails. Ce n'est pas une variable de premier niveau, car elle est attachée à un objet, mais si vous avez une portée, n'importe quoi, vous pouvez la joindre à cela.
this
devrait également fonctionner. Ainsi, par exemple, faire cela dans la portée globale déclarera une valeur pseudo constante sur la fenêtre (ce qui est vraiment une mauvaise idée, vous ne devriez pas déclarer les vars globaux sans précaution)note: l'affectation vous rendra la valeur assignée dans la console, mais la valeur de la variable ne changera pas
la source
Groupez les constantes en structures lorsque cela est possible:
Exemple, dans mon projet de jeu actuel, j'ai utilisé ci-dessous:
Affectation:
Comparaison:
Plus récemment, j'utilise, à titre de comparaison:
IE11 est avec la nouvelle norme ES6 qui a la déclaration «const».
Ci-dessus fonctionne dans les navigateurs précédents comme IE8, IE9 et IE10.
la source
Vous pouvez facilement équiper votre script d'un mécanisme de constantes qui peuvent être définies mais pas modifiées. Une tentative de modification entraînera une erreur.
la source
Oubliez IE et utilisez le
const
mot - clé.la source
Pourtant, il n'y a pas de moyen exact prédéfini pour tous les navigateurs, vous pouvez y parvenir en contrôlant la portée des variables comme indiqué dans les autres réponses.
Mais je proposerai d'utiliser l'espace de nom pour faire la distinction avec les autres variables. cela réduira le risque de collision au minimum des autres variables.
Espacement de noms approprié comme
donc tout en l'utilisant sera
iw_constant.name
ouiw_constant.age
Vous pouvez également bloquer l'ajout de toute nouvelle clé ou la modification d'une clé dans iw_constant à l'aide de la méthode Object.freeze. Cependant, ce n'est pas pris en charge sur le navigateur hérité.
ex:
Pour les anciens navigateurs, vous pouvez utiliser polyfill pour la méthode de gel.
Si vous êtes d'accord avec l'appel de la fonction suivante, c'est la meilleure façon de traverser le navigateur pour définir la constante. Portée de votre objet dans une fonction auto-exécutable et retour d'une fonction get pour vos constantes ex:
// pour obtenir la valeur, utilisez
iw_constant('name')
ouiw_constant('age')
** Dans les deux exemples, vous devez être très prudent sur l'espacement des noms afin que votre objet ou fonction ne soit pas remplacé par une autre bibliothèque (si l'objet ou la fonction lui-même sera remplacé, toute votre constante ira)
la source
Pendant un certain temps, j'ai spécifié des «constantes» (qui n'étaient toujours pas réellement des constantes) dans les littéraux d'objet transmis aux
with()
instructions. Je pensais que c'était si intelligent. Voici un exemple:Dans le passé, j'ai également créé un
CONST
espace de noms où je mettrais toutes mes constantes. Encore une fois, avec les frais généraux. Sheesh.Maintenant, je fais juste
var MY_CONST = 'whatever';
pour BAISER .la source
with
.Mon avis (ne fonctionne qu'avec des objets).
Essayer! Mais comprenez - c'est un objet, mais pas une simple variable.
Essayez aussi juste:
la source
Moi aussi, j'ai eu un problème avec ça. Et après un certain temps à chercher la réponse et à regarder toutes les réponses de tout le monde, je pense que j'ai trouvé une solution viable à cela.
Il semble que la plupart des réponses que j'ai rencontrées utilisent des fonctions pour contenir les constantes. Comme de nombreux utilisateurs des nombreux forums le mentionnent, les fonctions peuvent être facilement écrasées par les utilisateurs côté client. J'ai été intrigué par la réponse de Keith Evetts selon laquelle l'objet constantes n'est pas accessible par l'extérieur, mais uniquement par les fonctions à l'intérieur.
J'ai donc trouvé cette solution:
Mettez tout à l'intérieur d'une fonction anonyme afin que les variables, les objets, etc. ne puissent pas être modifiés par le client. Masquez également les fonctions «réelles» en faisant en sorte que d'autres fonctions appellent les fonctions «réelles» de l'intérieur. J'ai également pensé à utiliser des fonctions pour vérifier si une fonction a été modifiée par un utilisateur côté client. Si les fonctions ont été modifiées, modifiez-les à nouveau à l'aide de variables qui sont «protégées» à l'intérieur et ne peuvent pas être modifiées.
Il semble également que la sécurité soit vraiment un problème et il n'y a aucun moyen de «cacher» votre programmation du côté client. Une bonne idée pour moi est de compresser votre code afin qu'il soit vraiment difficile pour quiconque, y compris vous, le programmeur, de le lire et de le comprendre. Il existe un site sur lequel vous pouvez vous rendre: http://javascriptcompressor.com/ . (Ce n'est pas mon site, ne vous inquiétez pas, je ne fais pas de publicité.) C'est un site qui vous permettra de compresser et d'obscurcir du code Javascript gratuitement.
la source
Cela montre clairement la nécessité d'un mot-clé const inter-navigateur standardisé.
Mais pour l'instant:
ou
Les deux semblent suffisants et tout le reste, c'est comme tirer une mouche avec un bazooka.
la source
J'utilise à la
const
place devar
dans mes scripts Greasemonkey, mais c'est parce qu'ils ne fonctionneront que sur Firefox ... Laconvention de nom peut aussi être la voie à suivre (je fais les deux!).
la source
En JavaScript, ma pratique a été d'éviter autant que possible les constantes et d'utiliser des chaînes à la place. Des problèmes avec les constantes apparaissent lorsque vous souhaitez exposer vos constantes au monde extérieur:
Par exemple, on pourrait implémenter l'API Date suivante:
Mais il est beaucoup plus court et plus naturel d'écrire simplement:
De cette façon, les "jours" et les "heures" agissent vraiment comme des constantes, car vous ne pouvez pas changer de l'extérieur le nombre de secondes que "les heures" représentent. Mais il est facile d'écraser
MyModule.Date.HOUR
.Ce type d'approche facilitera également le débogage. Si Firebug vous dit
action === 18
qu'il est assez difficile de comprendre ce que cela signifie, mais quand vous voyez,action === "save"
c'est immédiatement clair.la source
"Hours"
au lieu de"hours"
- mais un IDE peut vous faire savoir très tôt que celaDate.Hours
n'est pas défini.D'accord, c'est moche, mais cela me donne une constante dans Firefox et Chrome, une constante inconstante (WTF?) Dans Safari et Opera, et une variable dans IE.
Bien sûr, eval () est mauvais, mais sans lui, IE lance une erreur, empêchant les scripts de s'exécuter.
Safari et Opera prennent en charge le mot clé const, mais vous pouvez modifier la valeur de const .
Dans cet exemple, le code côté serveur écrit JavaScript dans la page, en remplaçant {0} par une valeur.
À quoi cela sert-il? Pas grand-chose, car ce n'est pas multi-navigateur. Au mieux, peut-être un peu de tranquillité d'esprit qu'au moins certains navigateurs ne laisseront pas les bookmarklets ou les scripts tiers modifier la valeur.
Testé avec Firefox 2, 3, 3.6, 4, Iron 8, Chrome 10, 12, Opera 11, Safari 5, IE 6, 9.
la source
Si cela vaut la peine d'être mentionné, vous pouvez définir des constantes angulaires en utilisant
$provide.constant()
la source
Une version améliorée de la réponse de Burke qui vous permet de faire à la
CONFIG.MY_CONST
place deCONFIG.get('MY_CONST')
.Il nécessite IE9 + ou un véritable navigateur Web.
* Les propriétés sont en lecture seule, uniquement si les valeurs initiales sont immuables.
la source
JavaScript ES6 (re) a introduit le
const
mot clé qui est pris en charge dans tous les principaux navigateurs .En dehors de cela,
const
se comporte de manière similaire àlet
.Il se comporte comme prévu pour les types de données primitifs (booléen, nul, non défini, nombre, chaîne, symbole):
Attention: soyez conscient des pièges concernant les objets:
Si vous avez vraiment besoin d'un objet immuable et absolument constant: utilisez simplement
const ALL_CAPS
pour clarifier votre intention. De touteconst
façon, c'est une bonne convention à suivre pour toutes les déclarations, alors comptez-y.la source
Une autre alternative est quelque chose comme:
Alors simplement:
var foo = constantMap.MY_CONSTANT
Si vous le faisiez,
constantMap.MY_CONSTANT = "bar"
cela n'aurait aucun effet car nous essayons d'utiliser un opérateur d'affectation avec un getter, doncconstantMap.MY_CONSTANT === "myconstant"
cela resterait vrai.la source
en Javascript existe déjà des constantes . Vous définissez une constante comme celle-ci:
Cela ne peut pas changer par une réaffectation.
la source
Le mot-clé «const» a été proposé précédemment et il est maintenant officiellement inclus dans ES6. En utilisant le mot clé const, vous pouvez passer une valeur / chaîne qui agira comme une chaîne immuable.
la source
L'introduction de constantes dans JavaScript est au mieux un hack.
Une bonne façon de rendre des valeurs persistantes et accessibles à tous en JavaScript serait de déclarer un objet littéral avec quelques propriétés "en lecture seule" comme ceci:
vous aurez toutes vos constantes regroupées dans un seul objet accessoire "mon" où vous pourrez rechercher vos valeurs stockées ou toute autre chose que vous auriez pu décider d'y mettre d'ailleurs. Maintenant, testons si cela fonctionne:
Comme nous pouvons le voir, la propriété "my.constant1" a conservé sa valeur d'origine. Vous vous êtes fait de belles constantes temporaires "vertes" ...
Mais bien sûr, cela ne vous empêchera de modifier, d'altérer, d'annuler ou de vider accidentellement la valeur constante de votre propriété avec un accès direct comme dans l'exemple donné.
Sinon, je pense toujours que les constantes sont pour les nuls. Et je pense toujours qu'échanger votre grande liberté contre un petit coin de sécurité trompeuse est le pire commerce possible.
la source
Rhino.js
metconst
en œuvre en plus de ce qui a été mentionné ci-dessus.la source