Christoph Zurnieden: einfach JS Frage

Beitrag lesen

Hi,

ich habe ne sicherlich einfache Frage...

Wie Du an den Reaktionen und Diskussionen vielleicht schon festgestellt haben magst: nein, hast Du nicht ;-)

Ich wollte nur mal wissen ob man mit der Fallunterscheidung auch Berreiche abfragen kann ... also zum beispiel > 1 oder so.

Es hat sich ja bereits herausgestellt, das Du mit "Fallunterscheidung" eine switch() meinst. Nun ist ein switch(x) eigentlich nichts anders als eine Optimierungshilfe für den Compiler/Interpreter: die Variable x soll nur bei den in den "cases" bestimmten Werten wichtig sein, ansonsten nicht (oder auch umgekehrt, ist hier egal). Wenn diese Werte tatsächlich bestimmt sind (1,2,3 oder auch als Strings "eins, "zwei", "drei"), dann kann der Compiler/Interpreter sowas wunderbar optimieren.
Sind es aber Bereiche, die zudem an einer Seite offen sind, kann er das nicht, er bastelt daraus höchstwahrscheinlich eine if/else Kette. Das ist zwar einerseits angenehm, da Du das dann nicht selbst zu tun brauchst aber andererseits auch viel Arbeit für den Compiler/Interpreter. Bei einem Compiler ist das recht egal: da machst Du es nur einmal, aber bei einem Interpreter machst Du es bei jedem Aufruf des Scriptes.
Du kannst es also (ja, das war ein kaum nachvollziehbarer Sprung ;-) besser gleich eigenhändig trennen:

  
function testValues(a){  
  var found = false;  
  
  if(isNaN(a)) return Number.NaN;  
  
  switch(a){  
    case 1:  alert("a ist 1. Beweis: a = " + a);  
             found = true;  
             break;  
    case 7:  alert("a ist 5. Beweis: a = " + a);  
             found = true;  
             break;  
    default: break;  
  }  
  if(found) return;  
  if(a < 5){  
    alert("a ist kleiner als 5. Beweis: a = " + a);  
  }  
  if(a >= 5){  
    alert("a ist größergleich 5. Beweis: a = " + a);  
  }  
}  

Die Reihenfolge ist natürlich wichtig wenn die genauen Werte innerhalb der Bereichsabfragen liegen, wie es hier der Fall ist. Es geht natürlich auch andersrum aber dann würdest Du einen switch pro Bereichsabfrage benötigen:

  
function testValues(a){  
  if(isNaN(a)) return Number.NaN;  
  if(a < 5){  
    switch(a){  
      case -1: alert("a ist -1. Beweis: a = " + a);  
               break;  
      case 1:  alert("a ist 1. Beweis: a = " + a);  
               break;  
      case 4:  alert("a ist 4. Beweis: a = " + a);  
               break;  
      default: break;  
    }  
    alert("a ist kleiner als 5. Beweis: a = " + a);  
  }  
  if(a >= 5){  
    switch(a){  
      case 5:   alert("a ist 5. Beweis: a = " + a);  
                break;  
      case 7:   alert("a ist 7. Beweis: a = " + a);  
                break;  
      case 616: alert("a ist 616. Beweis: a = " + a);  
                break;  
      default: break;  
    }  
    alert("a ist größergleich 5. Beweis: a = " + a);  
  }  
}  

(beides nicht probiert und daher in der stillen Hoffnung, das ich keine allzu groben Fehler gemacht habe ;-)

so short

Christoph Zurnieden