"eval" 是不是只能用 JS "switch" 作为表达式?
Is "eval" the only way to use JS "switch" as an expression?
我发现在JavaScript中,switch总是一句指令,用它作为表达式会报错。
所以当我必须根据不同的条件给一个变量赋不同的值时,我必须这样写:
switch(true){
case x<0.1: aVariable = '#f0f0f0';break;
case x<0.2: aVariable = '#d3eadf';break;
case x<0.3: aVariable = '#bce1cd';break;
case x>=0.3: aVariable = '#9cd4b9';break;
}
或者我应该这样使用 'eval()':
aVariable = eval("switch(true){"+
"case x<0.1:'#f0f0f0';break;"+
"case x<0.2:'#d3eadf';break;"+
"case x<0.3:'#bce1cd';break;"+
"case x>=0.3:'#9cd4b9';break;"+
"}");
有没有其他方法可以将 switch 用作表达式而不是指令句,这样我的代码就不会那么冗长了?
另一种方法是使用函数并立即调用它:
var aVariable = (function(){ switch(true){
case x<0.1: return '#f0f0f0';
case x<0.2: return '#d3eadf';
case x<0.3: return '#bce1cd';
case x>=0.3: return '#9cd4b9';
}})(); // call it immediately
你也可以用 if
s 做这个技巧,因为 return
短路:
var aVariable = (function(){
if (x < 0.1) return '#f0f0f0';
if (x < 0.2) return '#d3eadf';
if (x < 0.3) return '#bce1cd';
if (x >= 0.3) return '#9cd4b9';
})(); // call it immediately
基本上,诀窍是我们将它包装在一个函数表达式中,将其转换为一个表达式,这种立即调用函数表达式的技术在 JavaScript.[=14= 中是一个有用的技巧]
您可以对数组使用直接方法,并在具有固定间隔的值时计算索引。所以根据你的价值观,你需要
value index comment
----- ----- ------------------------------------------
0.0 0 take integer of value * 10
0.05 0 see above
0.1 1 see above
0.15 1 see above
0.2 2 see above
0.25 2 see above
0.3 3 see above
0.35 3 covert by condition and a fixed value of 3
0.40 3 see above
对于四个值,这个答案可能看起来不太好,但是当涉及到具有固定间隔的更多值时,比考虑其他决策逻辑结构更容易。
function color(x) {
return ['#f0f0f0', '#d3eadf', '#bce1cd', '#9cd4b9'][x > 0.3 ? 3 : x * 10 | 0];
}
var i;
for (i = 0; i < 0.5; i += 0.05) {
document.write(i.toFixed(4) + ' ' + color(i) + '<br>');
}
这不是 switch
的一个很好的用途。 switch (true)
技巧通常不受欢迎。如果您确实选择使用它,并且确实希望它成为 "return" 一个值,那么是的,您可以将它包装在一个匿名函数中。多少额外的机器!为什么不直接写
x < 0.1 ? '#f0f0f0' :
x < 0.2 ? '#d3eadf' :
x < 0.3 ? '#bce1cd' :
'#9cd4b9'
这并不是说没有有效的用例需要语句或块来 return 一个值,并且在 ES 讨论组中已经就这个主题进行了热烈的讨论。我只是说这不是真正的情况之一。
除了其他答案中描述的迂回方法外,“switch 表达式”将在两个 JS 提案中的任何一个实现时实现:
我发现在JavaScript中,switch总是一句指令,用它作为表达式会报错。 所以当我必须根据不同的条件给一个变量赋不同的值时,我必须这样写:
switch(true){
case x<0.1: aVariable = '#f0f0f0';break;
case x<0.2: aVariable = '#d3eadf';break;
case x<0.3: aVariable = '#bce1cd';break;
case x>=0.3: aVariable = '#9cd4b9';break;
}
或者我应该这样使用 'eval()':
aVariable = eval("switch(true){"+
"case x<0.1:'#f0f0f0';break;"+
"case x<0.2:'#d3eadf';break;"+
"case x<0.3:'#bce1cd';break;"+
"case x>=0.3:'#9cd4b9';break;"+
"}");
有没有其他方法可以将 switch 用作表达式而不是指令句,这样我的代码就不会那么冗长了?
另一种方法是使用函数并立即调用它:
var aVariable = (function(){ switch(true){
case x<0.1: return '#f0f0f0';
case x<0.2: return '#d3eadf';
case x<0.3: return '#bce1cd';
case x>=0.3: return '#9cd4b9';
}})(); // call it immediately
你也可以用 if
s 做这个技巧,因为 return
短路:
var aVariable = (function(){
if (x < 0.1) return '#f0f0f0';
if (x < 0.2) return '#d3eadf';
if (x < 0.3) return '#bce1cd';
if (x >= 0.3) return '#9cd4b9';
})(); // call it immediately
基本上,诀窍是我们将它包装在一个函数表达式中,将其转换为一个表达式,这种立即调用函数表达式的技术在 JavaScript.[=14= 中是一个有用的技巧]
您可以对数组使用直接方法,并在具有固定间隔的值时计算索引。所以根据你的价值观,你需要
value index comment
----- ----- ------------------------------------------
0.0 0 take integer of value * 10
0.05 0 see above
0.1 1 see above
0.15 1 see above
0.2 2 see above
0.25 2 see above
0.3 3 see above
0.35 3 covert by condition and a fixed value of 3
0.40 3 see above
对于四个值,这个答案可能看起来不太好,但是当涉及到具有固定间隔的更多值时,比考虑其他决策逻辑结构更容易。
function color(x) {
return ['#f0f0f0', '#d3eadf', '#bce1cd', '#9cd4b9'][x > 0.3 ? 3 : x * 10 | 0];
}
var i;
for (i = 0; i < 0.5; i += 0.05) {
document.write(i.toFixed(4) + ' ' + color(i) + '<br>');
}
这不是 switch
的一个很好的用途。 switch (true)
技巧通常不受欢迎。如果您确实选择使用它,并且确实希望它成为 "return" 一个值,那么是的,您可以将它包装在一个匿名函数中。多少额外的机器!为什么不直接写
x < 0.1 ? '#f0f0f0' :
x < 0.2 ? '#d3eadf' :
x < 0.3 ? '#bce1cd' :
'#9cd4b9'
这并不是说没有有效的用例需要语句或块来 return 一个值,并且在 ES 讨论组中已经就这个主题进行了热烈的讨论。我只是说这不是真正的情况之一。
除了其他答案中描述的迂回方法外,“switch 表达式”将在两个 JS 提案中的任何一个实现时实现: