Switch语句比较用户输入的Javascript

Switch statement compare user input Javascript

本文关键字:Javascript 输入 用户 语句 比较 Switch      更新时间:2023-09-26

我正在尝试这个简单的代码,用户的输入似乎没有经过所有的比较,而是立即跳到默认的代码。我猜JS将用户的输入作为字符串。我确实尝试过parseInt(),但没有成功。这是我的密码;

var number = prompt('What''s your favority number?');
switch(number){
    case (number < 10):
        console.log('Your number is to small.');
        break;        
    case (number < 100):
        console.log('At least you''re in the double digits.');
        break;
    case (number < 1000):
        console.log('Looks like you''re in three digits.');
        break;
    default:
        console.log('Looks like you''re in the fouth digits.');
}

使用true作为开关的expression

switch语句计算表达式,将表达式的值与case子句相匹配,并执行与该case关联的语句。【参考】

switch语句首先计算其表达式。然后,它查找第一个case子句,该子句的表达式计算结果与输入表达式的结果值相同(使用严格比较===),并将控制权转移到该子句,执行相关联的语句。(如果多个事例与提供的值匹配,则会选择第一个匹配的事例,即使这些事例彼此不相等。)。如果找不到匹配的事例子句,则程序会查找可选的默认子句,如果找到,则会将控制权转移到该子句,执行关联的语句

var number = prompt('What''s your favority number?');
number = Number(number); //Use `Number` to cast it as a number
switch (true) {
  //----^^^^
  case (number < 10):
    console.log('Your number is to small.');
    break;
  case (number < 100):
    console.log('At least you''re in the double digits.');
    break;
  case (number < 1000):
    console.log('Looks like you''re in three digits.');
    break;
  default:
    console.log('Looks like you''re in the fouth digits.');
}
<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>

编辑:正如@bergi在评论中所建议的,if/else级联是解决这个问题的最佳方法。

var number = prompt('What''s your favority number?');
number = Number(number); //Use `Number` to cast it as a number
if (number < 10)
  console.log('Your number is to small.');
else if (number < 100)
  console.log('At least you''re in the double digits.');
else if (number < 1000)
  console.log('Looks like you''re in three digits.');
else
  console.log('Looks like you''re in the fouth digits.');

您不了解switch语句是如何工作的。它不是检查动态值的快捷方式。这是检查已知值的快捷方式。

每个事例都是一个语句,它被评估为一个值。如果你查看这些文档,你会发现它们有case: value,而不是你正在尝试的case: (expression)。所以,它将把你所有的表达式转化为值。

例如,您的第一个案例是:

case (number < 10):

但真正的情况是:

case false:

当然,没有数字会评估为false(从技术上讲,0是一个伪值,但交换机使用===比较,而不是==,所以0 === false // false)。因此,你所有的案例都是case false,所以开关通过所有案例,落在default案例上。

因此,对于您的情况,switch语句是不合适的。您应该使用if语句。

if(number < 10) {
} else if(number < 100) {
} else if(number < 1000) {
} else {
}

只有当您知道以下值时,switch语句才适用:

switch(number) {
  case 10:
    break;
  case 100:
    break;
  case 1000:
    break;
  default:
}

(是的,使用parseInt来确保您有整数。)