web-dev-qa-db-ja.com

Javascriptで定数を条件付きで初期化する

ES6以降、constがあります。

これは許可されていません:

const x; //declare first
//and then initialize it
if(condition) x = 5;
else x = 10;

これは、初期化する前に定数を使用できないためです。

しかし、もし私が

if(condition)
    const x = 5;

else 
    const x = 10;

xはブロックスコープになります。

では、定数を条件付きで作成する方法は?

22
Frozen Crayon

あなたが知っているように、あなたの問題は、constが宣言されたのと同じステートメントで初期化されなければならないことです。

これは、定数に割り当てる値がリテラル値である必要があるという意味ではありません。それは本当に有効なステートメントである可能性があります-三項:

const x = IsSomeValueTrue() ? 1 : 2;

または、単に変数の値に割り当てますか?

let y = 1;
if(IsSomeValueTrue()) {
    y = 2;
}

const x = y;

もちろん、それを関数の戻り値に割り当てることもできます。

function getConstantValue() {
    return 3;
}

const x = getConstantValue();

したがって、値を動的にする方法はたくさんあります。1つの場所にのみ割り当てられるようにする必要があります。

27
Hecksa

三項演算子が読みにくいオプションではない場合、他のオプションはIIFEのみです。これは扱いにくいですが、流fluentに読むことができます。

const x = (() => {
  if (condition)
    return 5
  else
    return 10
})();

constのセマンティクスは、一度割り当てられることです。このユースケースでは、letである必要があります。

let x;
if(condition) x = 5;
else x = 10;

私の個人的な経験から、変数の〜95%はconstです。変数をletにする必要がある場合は、それ自体をそのままにします。偶発的な再割り当てによって引き起こされるバグの可能性は無視できます。

14
Estus Flask

constbothインスタンスで宣言されると仮定すると、3項代入を使用できます。

const x = condition ? 5 : 10;
4
CodingIntrigue

Singleton Pattern 実装でこのソリューションを提案します:

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();
1