switch/case总是返回默认值

switch/case always returns default value

本文关键字:返回 默认值 case switch      更新时间:2023-09-26

我有以下问题:无论我尝试什么,我的函数总是返回默认值。当我使用if/else语句时,一切都很好。故障在哪里?

function auswertung(stueckzahl) {
	var preis1 = 0.77;
	var preis2 = 0.76;
	var preis3 = 0.73;
	var preis4 = 0.69;
	var preis5 = 0.67;
		switch(stueckzahl) {
			
		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;
		}
		}
	}
		
document.write (auswertung(10000));

您可以完美地使用带有布尔true作为表达式的开关来逐个重新评估您的案例。

这样你的代码保持干净:

function auswertung(stueckzahl) {
  switch (true) {
    case stueckzahl >= 10001 && stueckzahl <= 30000:
      return 0.67;
    case stueckzahl >= 5001 && stueckzahl <= 10000:
      return 0.69;
    case stueckzahl >= 2501 && stueckzahl <= 5000:
      return 0.73;
    case stueckzahl >= 1001 && stueckzahl <= 2500:
      return 0.76;
    case stueckzahl >= 500 && stueckzahl <= 1000:
    default:
      return 0.77;
  }
}
console.log('500:', auswertung(500));
console.log('10000:', auswertung(10000));
console.log('30000:', auswertung(30000));

如果将表达式传递给case语句,则首先对其求值。

根据规范

  1. 设exprRef是对表达式求值的结果。

  2. 让switchValue为GetValue(exprRef)。

所以,

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

将是CCD_ 3或CCD_。

这意味着除非stueckzahltrue/false,否则它将始终转到default部分。

您需要通过doing将此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;
    }

您需要在每个case语句之后包含break;

例如

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

否则,脚本将继续检查下一个case

如果没有break;,脚本将始终通过运行default case来完成。

您的开关希望"stueckzahl"是一个值,而不是"true"或"false",这就是"(stueckzahl>=500)&&(stueckzahl<=1000)"返回的值。

您必须使用"if/else"语句才能实现您想要的目标

开关的工作方式如下。

将开关表达式和不同的大小写值进行比较。如果比较结果为true,则执行案例下的代码。

您的交换机表达式是stueckzahl

其中一个case表达式值为:((stueckzahl>=500) && (stueckzahl <= 1000)),它将根据stueckzahl的值计算为true或false。

所以最后你要比较的是:stueckzahl == truestueckzahl == 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