是" eval"使用JS" switch"的唯一方法作为表达?

时间:2015-09-08 06:51:33

标签: javascript switch-statement eval

我发现在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;
}

或者我应该使用&#39; eval()&#39;像这样:

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用作表达式而不是指令语句,以便我可以使我的代码更简洁?

3 个答案:

答案 0 :(得分:3)

另一种方法是使用函数并立即调用它:

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短路后,您也可以使用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中是一个有用的技巧。

答案 1 :(得分:2)

您可以对数组使用直接方法,并在具有固定间隔的值时计算索引。所以根据你的价值观,你需要

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

对于四个值,这个答案可能看起来不太好,但是当涉及到具有固定间隔的更多值时,则更容易考虑决策逻辑的其他结构。

&#13;
&#13;
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>');
}
&#13;
&#13;
&#13;

答案 2 :(得分:0)

这不是switch的好用。 switch (true)技巧通常不受欢迎。如果你确实选择使用它,并且你确实希望它“返回”一个值,那么是的,你可以将它包装在一个匿名函数中。什么额外的机械!为什么不写

x < 0.1 ? '#f0f0f0' :
x < 0.2 ? '#d3eadf' :
x < 0.3 ? '#bce1cd' :
'#9cd4b9'

这并不是说没有有效的用例需要语句或块来返回值,而且ES Discuss小组已就这个主题进行了动画讨论。我只是说这不是其中一种情况。