2016-07-26 4 views
1

私は次の問題があります。私の関数は、何を試しても、常にデフォルト値を返します。 if/elseステートメントを使用すると、すべて正常に動作します。失敗はどこですか?スイッチ/ケースは常にデフォルト値を返します

function auswertung(stueckzahl) { 
 

 
\t var preis1 = 0.77; 
 
\t var preis2 = 0.76; 
 
\t var preis3 = 0.73; 
 
\t var preis4 = 0.69; 
 
\t var preis5 = 0.67; 
 

 
\t \t switch(stueckzahl) { 
 
\t \t \t 
 
\t \t case ((stueckzahl>=500) && (stueckzahl <= 1000)): { 
 
\t \t \t return preis1; 
 
\t \t } 
 
\t \t case ((stueckzahl >= 1001) && (stueckzahl <= 2500)): { 
 
\t \t \t return preis2; 
 
\t \t } 
 
\t \t case ((stueckzahl >= 2501) && (stueckzahl <= 5000)): { 
 
\t \t \t return preis3; 
 
\t \t } 
 
\t \t case ((stueckzahl >= 5001) && (stueckzahl <= 10000)): { 
 
\t \t \t return preis4; 
 
\t \t } 
 
\t \t case ((stueckzahl >= 10001) && (stueckzahl <= 30000)): { 
 
\t \t \t return preis5; 
 
\t \t } 
 
\t \t default: { 
 
\t \t \t return preis1; 
 
\t \t } 
 

 
\t \t } 
 
\t } 
 
\t \t 
 
document.write (auswertung(10000));

+0

'(stueckzahl> = 500)&&(stueckzahl <= 1000)'評価しますあなたの場合は

は何がしたいことは、IFSの連鎖であることになりますtrueまたはfalseに設定する – gurvinder372

+2

'switch(true)'またはif-elseチェーンのいずれかが必要です。 – gcampbell

+0

'switch'は、スイッチド変数' stueckzahl'の値と 'case'ステートメントのそれぞれとを比較します。 'stueckzahl'は決して' true'や 'false'と等しくないので、毎回' default'ブロックが得られます。 'switch 'を正しく使っていません。 – Yuck

答えて

1

あなたはcaseの文に式を渡している場合、それは最初に評価されます。あたりspec

  1. として

    はexprRefは式を評価した結果とします。

  2. switchValueをGetValue(exprRef)とします。

ので、

(stueckzahl>=500) && (stueckzahl <= 1000) 

trueまたはfalseのいずれかになります。 stueckzahltrue/falseでない限り、それは常にdefaultセクションに移動することを意味し

このswitch文をif/elseと置き換える必要があります。 (また、単にすべての条件の上限を確認してください)

if (stueckzahl <= 1000) { 
     return preis1; 
    } 
    if (stueckzahl <= 2500) { 
     return preis2; 
    } 
    if (stueckzahl <= 5000) { 
     return preis3; 
    } 
    if (stueckzahl <= 10000) { 
     return preis4; 
    } 
    if (stueckzahl <= 30000) { 
     return preis5; 
    } 
    else { 
     return preis1; 
    } 
+0

最初の 'if'ステートメントの後、OPは実際にはローエンドの値をもう一度比較する必要はありません。各値セグメントの上限を比較することができます。 – Yuck

+0

@Yuck thats良い提案です、ありがとうございます。私は変更を加えました – gurvinder372

+1

elsesの必要はありませんそこにすでに戻り値があります:) – Juan

0

あなたのスイッチが「stueckzahlは」値、「true」または「false」ではないことを期待し、それがどのような「(stueckzahl> = 500)&です&(stueckzahl < = 1000) "が返されます。

あなたは「/他の場合には、」あなたは

+0

ありがとう、あなたの答えは私を助けてくれました! – Peter

0

あなたは各case文の後break;を含める必要が望むものを達成するために、ステートメントを使用する必要があります。

switch (true) { 
    case ((stueckzahl >= 500) && (stueckzahl <= 1000)): return preis1; break; 
    case ((stueckzahl >= 1001) && (stueckzahl <= 2500)): return preis2; break; 
    [...] 
} 

そうでない場合、スクリプトは次のcaseをチェックするために行くだろう。

break;を入力しないと、スクリプトは常にdefault caseを実行して終了します。

+1

リターンしている場合は、breakを使用する必要はありません。彼はスイッチの文 – Juan

3

switchのブール値trueexpressionとして完全に使用して、ケースを1つずつ再評価することができます。

あなたのコードがきれいなままこの方法:

function auswertung(stueckzahl) { 
 
    var preis1 = 0.77, 
 
     preis2 = 0.76, 
 
     preis3 = 0.73, 
 
     preis4 = 0.69, 
 
     preis5 = 0.67; 
 

 
    switch (true) { 
 
     case stueckzahl >= 500 && stueckzahl <= 1000: 
 
      return preis1; 
 
     case stueckzahl >= 1001 && (stueckzahl <= 2500): 
 
      return preis2; 
 
     case stueckzahl >= 2501 && stueckzahl <= 5000: 
 
      return preis3; 
 
     case stueckzahl >= 5001 && stueckzahl <= 10000: 
 
      return preis4; 
 
     case stueckzahl >= 10001 && stueckzahl <= 30000: 
 
      return preis5; 
 
     default: 
 
      return preis1; 
 
    } 
 
} 
 

 
console.log('500:', auswertung(500)); 
 
console.log('10000:', auswertung(10000)); 
 
console.log('30000:', auswertung(30000));

+0

+1を完全に間違って使用していますが、この方法で 'switch'を使うと誤解を招くことがあります。 IMHO代わりに 'if..else'を使う方が良いでしょう。 – Yuck

+0

@Yuckそれは多くの異なった方法で行うことができます。しかし、この特定の状況では、switch文が輝きます。 'auswertung()'関数は 'expressions'を一つずつ再評価し、最初の' true'の場合に適切な "preis"を返します。ちょうどきれいです;) –

+0

@Yuckも 'switch'を使う利点の一つです特に複数の 'if(){...} else if(){...}'ステートメントの使用を避けるためです –

0

スイッチが動作する方法がfollwoingです。

スイッチ式を異なる大文字と小文字の値と比較します。その比較が真であると評価された場合には、そのケースのコードが実行されます。

あなたのスイッチ式はstueckzahl

case式の値の一つがあるさ:stueckzahlの値に応じて、trueまたはfalseに評価されます((stueckzahl>=500) && (stueckzahl <= 1000))

最終的に比較するものはstueckzahl == trueまたはstueckzahl == falseです。関数のパラメータとして数値を渡すと決して真ではありません。中

if ((stueckzahl>=500) && (stueckzahl <= 1000)) { 
     return preis1; 
    } 
    if ((stueckzahl >= 1001) && (stueckzahl <= 2500)) { 
     return preis2; 
    } 
    if ((stueckzahl >= 2501) && (stueckzahl <= 5000)) { 
     return preis3; 
    } 
    if ((stueckzahl >= 5001) && (stueckzahl <= 10000)) { 
     return preis4; 
    } 
    if ((stueckzahl >= 10001) && (stueckzahl <= 30000)) { 
     return preis5; 
    } 

    return preis1; 

詳細:http://www.w3schools.com/js/js_switch.asp

関連する問題