有条件地在Javascript中初始化常量

时间:2016-08-04 10:45:46

标签: javascript ecmascript-6 constants

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成为块范围。

那么如何有条件地创建一个常量?

4 个答案:

答案 0 :(得分:22)

正如您所知,您的问题是const必须在声明它的同一语句中初始化。

这并不意味着您为常量赋值必须是文字值。它可能是任何有效的陈述 - 三元:

const x = IsSomeValueTrue() ? 1 : 2;

或者只是将其分配给变量的值?

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

const x = y;

您当然也可以将其分配给函数的返回值:

function getConstantValue() {
    return 3;
}

const x = getConstantValue();

因此,有很多方法可以使价值变得动态,你只需要确保它只在一个地方分配。

答案 1 :(得分:13)

如果三元运算符不是其不可读性的选项,那么唯一的另一种选择是IIFE,这很麻烦,但可以流利地阅读:

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

const的语义是它被分配一次。对于此用例,它应为let

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

根据我个人的经验,~95%的变数是const。如果一个变量必须是let,那就让它自己吧;意外重新分配造成的错误概率可以忽略不计。

答案 2 :(得分:4)

假设{<1}}将在两个实例中声明,您可以使用三元分配:

const

答案 3 :(得分:0)

我建议使用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();