web-dev-qa-db-fra.com

Initialisation conditionnelle d'une constante en Javascript

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?

19
Frozen Crayon

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.

19
Hecksa

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.

12
estus

En supposant que la const soit déclarée dans les deux instances, vous pouvez utiliser une affectation ternaire:

const x = condition ? 5 : 10;
4
CodingIntrigue

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();
0
Ala Eddine JEBALI