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

Fro*_*yon 24 javascript constants ecmascript-6

ES6以后我们有const.

这是不允许的:

const x; //declare first
//and then initialize it
if(condition) x = 5;
else x = 10;
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为它阻止我们在初始化之前使用常量.

但如果我这样做

if(condition)
    const x = 5;

else 
    const x = 10;
Run Code Online (Sandbox Code Playgroud)

x成为块范围.

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

Hec*_*ksa 31

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

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

const x = IsSomeValueTrue() ? 1 : 2;
Run Code Online (Sandbox Code Playgroud)

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

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

const x = y;
Run Code Online (Sandbox Code Playgroud)

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

function getConstantValue() {
    return 3;
}

const x = getConstantValue();
Run Code Online (Sandbox Code Playgroud)

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


Est*_*ask 14

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

const x = (() => {
  if (condition)
    return 5
  else
    return 10
})();
Run Code Online (Sandbox Code Playgroud)

语义const是它被分配一次.应该是let这个用例:

let x;
if(condition) x = 5;
else x = 10;
Run Code Online (Sandbox Code Playgroud)

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

  • 如果三元不可读,那么IIFE*如何更好*?那可读性差得多. (3认同)
  • @ssube IIFE 是既定的语言结构,可以由流利的 JS 使用者自动解释,箭头使它们更苗条,适当的缩进和括号也有帮助。这是主观的,但应该注意,答案中没有“更好”这个词,“地球”这个词不会使论证更有效。IIFE 对您不起作用的事实并不意味着它们对每个人都不起作用,无论如何,感谢您的评论反对票。 (3认同)
  • IIFE有他们的时间和地点,但这可以通过定期调用兄弟方法来解决.使用IIFE来内联该方法(JIT将自行完成)只会让你比三元组更复杂. (2认同)

Cod*_*gue 7

假设const将在两种情况下声明,您可以使用三元赋值:

const x = condition ? 5 : 10;
Run Code Online (Sandbox Code Playgroud)

  • @ArjunU。阅读 `const [a,b] = [x,y]` 赋值。 (3认同)