J'ai récemment rencontré le mot clé const en javascript. D'après ce que je peux dire, il est utilisé pour créer des variables immuables , et j'ai testé pour m'assurer qu'il ne pouvait pas être redéfini (dans node.js):
const x = 'const';
const x = 'not-const';
// Will give an error: 'constant 'x' has already been defined'
Je me rends compte qu'il n'est pas encore normalisé sur tous les navigateurs - mais je ne m'intéresse qu'au contexte de node.js/v8, et j'ai remarqué que certains développeurs/projets semblent le favoriser fortement lorsque le var mot clé pourrait être utilisé dans le même sens.
Des questions?
Quand est-il approprié d'utiliser const à la place de var?
Devrait-il être utilisé chaque fois qu'une variable qui ne sera pas réaffectée est déclarée?
Est-ce que cela fait réellement une différence si var est utilisé à la place de const ou inversement?
Vos questions comportent deux aspects: quels sont les aspects techniques de l’utilisation de const
au lieu de var
et quels sont les aspects humains de le faire?.
La différence technique est significative. Dans les langages compilés, une constante sera remplacée au moment de la compilation et son utilisation permettra d'autres optimisations, telles que la suppression du code mort, afin d'accroître encore l'efficacité du code à l'exécution. Les moteurs JavaScript récents (termes peu utilisés) compilent en réalité le code JS pour améliorer les performances. Par conséquent, le mot-clé const les informerait que les optimisations décrites ci-dessus sont possibles et doivent être effectuées. Cela se traduit par de meilleures performances.
L'aspect humain concerne la sémantique du mot clé. Une variable est une structure de données contenant des informations susceptibles de changer. Une constante est une structure de données qui contient des informations qui ne changeront jamais. S'il y a place à l'erreur, var
devrait toujours être utilisé. Cependant, toutes les informations qui ne changent jamais au cours de la vie d'un programme doivent être déclarées avec const
. Si, dans des circonstances différentes, les informations doivent changer, utilisez var
pour l'indiquer, même si le changement réel n'apparaît pas dans votre code.
Mise à jour 2017
Cette réponse reçoit toujours beaucoup d'attention. Il convient de noter que cette réponse a été publiée au début de 2014 et que beaucoup de choses ont changé depuis. Le support ecmascript-6 _ est maintenant la norme. _ { Tous les navigateurs modernes } _ supporte maintenant const
, il devrait donc être assez sûr de l'utiliser sans aucun problème.
Réponse originale de 2014
Malgré le support assez décent du navigateur , je ne l’utiliserais pas pour le moment. De article de MDN sur const
:
L'implémentation actuelle de const est une extension spécifique à Mozilla et ne fait pas partie de ECMAScript 5. Elle est prise en charge dans Firefox et Chrome (V8). À partir de Safari 5.1.7 et Opera 12.00, si vous définissez une variable avec const dans ces navigateurs, vous pourrez toujours modifier sa valeur ultérieurement. Il n'est pas pris en charge dans Internet Explorer 6-10, mais est inclus dans Internet Explorer 11. Le mot-clé const déclare actuellement la constante dans l'étendue de la fonction (comme les variables déclarées avec var).
Il poursuit ensuite:
const
va être défini par ECMAScript 6, mais avec une sémantique différente. Semblables aux variables déclarées avec l'instruction let, les constantes déclarées avec const auront une portée de bloc.
Si vous utilisez const
, vous devrez ajouter une solution de contournement pour prendre en charge les navigateurs un peu plus anciens.
Pour intégrer les réponses précédentes, la déclaration des variables constantes présente un avantage évident, mis à part le motif performances: si vous essayez accidentellement de les modifier ou de les reclasser dans le code, le programme ne modifiera pas la valeur et ne générera pas d'erreur.
Par exemple, comparez:
// Will output 'SECRET'
const x = 'SECRET'
if (x = 'ANOTHER_SECRET') { // Warning! assigning a value variable in an if condition
console.log (x)
}
avec:
// Will output 'ANOTHER_SECRET'
var y = 'SECRET'
if (y = 'ANOTHER_SECRET') {
console.log (y)
}
ou
// Will throw TypeError: const 'x' has already been declared
const x = "SECRET"
/* complex code */
var x = 0
avec
// Will reassign y and cause trouble
var y = "SECRET"
/* complex code */
var y = 0
const
est pas immuable.
De la MDN :
La déclaration const crée une référence en lecture seule à une valeur. Il ne signifie pas que la valeur qu'il détient est immuable, mais simplement que la variable l'identifiant ne peut pas être réaffecté.
Pourquoi utiliser const
, la réponse de @ Tibos est excellente.
Mais vous avez dit:
D'après ce que je peux dire, il est utilisé pour créer des variables immuables
C'est faux. La mutation d'une variable est différente de la réaffectation:
var hello = 'world' // assigning
hello = 'bonjour!' // reassigning
Avec const, vous ne pouvez pas faire ça:
const hello = 'world'
hello = 'bonjour!' // error
Mais vous pouvez muter votre variable:
const marks = [92, 83]
marks.Push(95)
console.log(marks) // [92, 83, 95] -> the variable has been mutated.
Ainsi, tout processus qui modifie la valeur de la variable sans à l'aide du signe =
est mis en sourdine.
Remarque: +=
, par exemple, est ... réaffecté!
var a = 5
a += 2 // is the same as a = a + 2
En résumé, la ligne de fond est la suivante: const
ne vous empêche pas de muter des variables, cela vous empêche de réaffecter les.
Vous avez d'excellentes réponses, mais restons simples.
const
devrait être utilisé lorsque vous avez une constante définie (comme suit: elle ne changera pas pendant l'exécution du programme).
Par exemple:
const pi = 3.1415926535
Si vous pensez que cela peut être modifié lors d'une exécution ultérieure, utilisez une variable var
.
La différence pratique, basée sur l'exemple, est qu'avec const
, vous supposerez toujours que pi sera 3,14 [...], c'est un fait.
Si vous le définissez comme une var
, il pourrait être 3.14 [...] ou non.
Pour une réponse plus technique, @Tibos a théoriquement raison.
var : Déclare une variable, initialisation de la valeur optionnelle.
let : Déclare une variable locale avec une portée de bloc.
const : Déclare une constante nommée en lecture seule.
Ex:
var a;
a = 1;
a = 2;//re-initialize possible
var a = 3;//re-declare
console.log(a);//3
let b;
b = 5;
b = 6;//re-initiliaze possible
// let b = 7; //re-declare not possible
console.log(b);
// const c;
// c = 9; //initialization and declaration at same place
const c = 9;
// const c = 9;// re-declare and initialization is not possible
console.log(c);//9
// NOTE: Constants can be declared with uppercase or lowercase, but a common
// convention is to use all-uppercase letters.
D'après mon expérience, j'utilise const lorsque je veux définir quelque chose que je souhaiterai peut-être modifier ultérieurement sans avoir à parcourir le code à la recherche de bits ayant été codés en dur, par exemple. Un chemin de fichier ou un nom de serveur.
L'erreur dans vos tests est une autre chose, cependant, vous essayez de créer une autre variable appelée x, ce serait un test plus précis.
const x = 'const';
x = 'not-const';
Préférence personnelle vraiment. Vous pouvez utiliser const lorsque, comme vous le dites, il ne sera pas réaffecté et est constant. Par exemple, si vous souhaitez attribuer votre anniversaire. Votre anniversaire ne change jamais, vous pouvez donc l'utiliser comme une constante. Mais votre âge change, donc cela pourrait être une variable.
Résumé:
const crée une liaison immutable, ce qui signifie que l'identificateur de variable const n'est pas réaffectable.
const a = "value1";
vous ne pouvez pas le réaffecter avec
a = "value2";
Cependant, si identificateur const contient un objet ou un tableau, sa valeur peut être modifiée dans la mesure où nous ne le réaffectons pas.
const x = { a: 1 }
x.a = 2; //is possible and allowed
const numbers = [1, 2];
numbers.Push(3); //is possible and allowed
Veuillez noter que const est un block-scoped, tout comme let, ce qui n’est pas identique à var (qui est fonctionnel-scoped)
En bref, quand quelque chose n'est pas susceptible de changer lors de la réaffectation, utilisez const, sinon utilisez let ou var en fonction de l'étendue que vous souhaitez avoir.
Il est beaucoup plus facile de raisonner sur le code lorsqu'il est tout à fait évident de savoir ce qui peut être changé par une réaffectation et ce qui ne peut pas être. Changer un const en let est extrêmement simple. Et aller par défaut vous fait réfléchir à deux fois avant de le faire. Et c'est dans de nombreux cas une bonne chose.
Il fournit: 1) une référence constante, par exemple, const x = [] - le tableau peut être modifié, mais x ne peut pas pointer vers un autre tableau; et 2) bloquer la portée . const et laisser ensemble remplacer var dans ecma6/2015 Voir discussion à https://strongloop.com/strongblog/es6-variable-declarations/
Main point is that how to decide which one identifier should be used during development.
In Java-script here are three identifiers.
1. var (Can re-declared & re-initialize)
2. const (Can't re-declared & re-initialize, can update array values by using Push)
3. let (Can re-initialize but can't re-declare)
'var': Au moment du codage, lorsque nous parlons de code standard, nous utilisons généralement le nom de l'identifiant, qui est facile à comprendre pour les autres utilisateurs/développeurs. Par exemple, si nous travaillons avec plusieurs fonctions, nous utilisons certaines entrées, nous les traitons et renvoyons des résultats, comme:
**Example of variable use**
function firstFunction(input1,input2)
{
var process = input1 + 2;
var result = process - input2;
return result;
}
function otherFunction(input1,input2)
{
var process = input1 + 8;
var result = process * input2;
return result;
}
Dans les exemples ci-dessus, les deux fonctions produisent des résultats différents mais en utilisant le même nom de variables. Nous pouvons voir ici que 'processus' et 'résultat' sont tous deux utilisés comme variables et qu'ils devraient l'être.
**Example of constant with variable**
const tax = 10;
const pi = 3.1415926535;
function firstFunction(input1,input2)
{
var process = input1 + 2;
var result = process - input2;
result = (result * tax)/100;
return result;
}
function otherFunction(input1,input2)
{
var process = input1 + 8;
var result = process * input2 * pi;
return result;
}
Avant d'utiliser 'let' dans le script Java, nous devons ajouter 'use strict' en haut du fichier js
**Example of let with constant & variable**
const tax = 10;
const pi = 3.1415926535;
let trackExecution = '';
function firstFunction(input1,input2)
{
trackExecution += 'On firstFunction';
var process = input1 + 2;
var result = process - input2;
result = (result * tax)/100;
return result;
}
function otherFunction(input1,input2)
{
trackExecution += 'On otherFunction'; # can add current time
var process = input1 + 8;
var result = process * input2 * pi;
return result;
}
firstFunction();
otherFunction();
console.log(trackExecution);
Dans l'exemple ci-dessus, vous pouvez savoir quelle fonction a été exécutée quand et laquelle n'a pas été utilisée lors d'une action spécifique.
Premièrement, trois choses utiles à propos de const
(autres que les améliorations apportées à la portée avec lesquelles elle partage let
):
Vos questions:
Quand est-il approprié d'utiliser
const
à la place devar
?
Vous pouvez le faire chaque fois que vous déclarez une variable dont la valeur ne change jamais. Que vous jugiez cela approprié dépend entièrement de vos préférences/des préférences de votre équipe.
Devrait-il être utilisé chaque fois qu'une variable qui ne sera pas réaffectée est déclarée?
C'est à vous/votre équipe de décider.
Est-ce que cela fait réellement une différence si
var is used in place of
const` ou vice-versa?
Oui:
var
et const
ont des règles de portée différentes. (Vous auriez peut-être voulu comparer avec let
plutôt que var
.) Plus précisément: const
et let
ont une portée de bloc et, lorsqu'ils sont utilisés avec une portée globale, ne créez pas de propriétés sur l'objet global (même s'ils créent des objets globaux). var
a une portée globale (lorsqu'elle est utilisée dans une portée globale) ou une étendue de fonction (même si elle est utilisée dans un bloc) et, lorsqu'elle est utilisée dans une portée globale, crée une propriété sur l'objet global.Je ne suis pas un expert dans le domaine de la compilation JS, mais il est logique de dire que v8 utilise le drapeau const.
Normalement, après avoir déclaré et modifié une série de variables, la mémoire est fragmentée et la v8 s’arrête de s’exécuter, fait une pause de quelques secondes pour créer gc ou garbage collection.
si une variable est déclarée avec const v8, vous pouvez être sûr de la placer dans un conteneur de taille fixe étroite entre les autres variables const, car elle ne changera jamais ..____. Elle peut également enregistrer les opérations appropriées pour ces types de données car le type ne changera pas. .