从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 变为块级作用域。
那么如何有条件地创建常量?
从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 变为块级作用域。
那么如何有条件地创建常量?
正如您所知,您的问题在于const
必须在声明表达式中初始化。
这并不意味着您分配给常量的值必须是字面值。它实际上可以是任何有效的表达式 - 三目运算符:
const x = IsSomeValueTrue() ? 1 : 2;
或者只是将它分配给变量的值?
let y = 1;
if(IsSomeValueTrue()) {
y = 2;
}
const x = y;
你当然可以将它分配给函数的返回值,例如:function getConstantValue() {
return 3;
}
const x = getConstantValue();
所以有很多方法可以使价值动态化,你只需要确保它只在一个地方分配即可。
如果三元运算符因其难以阅读而不可行,那么唯一的选择是IIFE,虽然它很麻烦但可以流畅地阅读:
const x = (() => {
if (condition)
return 5
else
return 10
})();
const
的语义是只能被赋值一次。这种情况下应该使用let
:
let x;
if(condition) x = 5;
else x = 10;
从我的个人经验来看,大约95%的变量都是const
。如果一个变量必须是let
,就让它保持不变;由于意外重新赋值引起的错误概率微乎其微。
const
,你可以使用三元赋值运算符来实现:const x = condition ? 5 : 10;
:?
是一种邪恶的、不可读的风格。它违背了“不要重复自己”的原则,所谓的“可读性”就是基于这个原则的 :) - Little Alienx = cond ? a : b; y = cond ? e : f
- Frozen Crayonconst [a,b] = [x,y]
的赋值语句。 - Little Alien