ES6 à partir de nous avons const
.
Ceci n'est pas autorisé:
const x; //declare first
//and then initialize it
if(condition) x = 5;
else x = 10;
Cela a du sens car cela nous empêche d’utiliser la constante avant son initialisation.
Mais si je le fais
if(condition)
const x = 5;
else
const x = 10;
x devient périmètre de bloc.
Alors, comment créer conditionnellement une constante?
Comme vous le savez, votre problème est qu’une const
doit être initialisée dans la même déclaration qu’elle a été déclarée.
Cela ne signifie pas que la valeur que vous attribuez à votre constante doit être une valeur littérale. Ce pourrait être n'importe quelle affirmation valable - ternaire:
const x = IsSomeValueTrue() ? 1 : 2;
Ou peut-être simplement l'assigner à la valeur d'une variable?
let y = 1;
if(IsSomeValueTrue()) {
y = 2;
}
const x = y;
Vous pouvez bien sûr l'affecter à la valeur de retour d'une fonction également:
function getConstantValue() {
return 3;
}
const x = getConstantValue();
Il existe donc de nombreuses façons de rendre la valeur dynamique, il suffit de s’assurer qu’elle n’est assignée qu’à un seul endroit.
Si l'opérateur ternaire n'est pas une option pour son illisibilité, la seule autre option est l'IIFE, qui est lourd mais peut être lu couramment:
const x = (() => {
if (condition)
return 5
else
return 10
})();
La sémantique de const
est qu'elle est assignée une fois. Il devrait être let
pour ce cas d'utilisation:
let x;
if(condition) x = 5;
else x = 10;
D'après mon expérience personnelle, environ 95% des variables sont const
. Si une variable doit être let
, laissez-la simplement elle-même; la probabilité de bugs causés par des réaffectations accidentelles est négligeable.
En supposant que la const
soit déclarée dans les deux instances, vous pouvez utiliser une affectation ternaire:
const x = condition ? 5 : 10;
Je suggère cette solution avec un Singleton Pattern implementation:
var Singleton = (function () {
var instance;
function createInstance() {
// all your logic here
// so based on your example:
// if(condition) return 5;
// else return 10;
}
return {
getInstance: function () {
if (!instance) {
instance = createInstance();
}
return instance;
}
};
})();
const x = Singleton.getInstance();