【问题标题】:Switch statement compare user input JavascriptSwitch 语句比较用户输入 Javascript
【发布时间】:2016-08-09 17:11:16
【问题描述】:

我正在尝试这个简单的代码,似乎用户的输入没有经过所有的比较,而是立即跳转到默认的。我猜 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.');
}

【问题讨论】:

标签: javascript switch-statement user-input


【解决方案1】:

使用true 作为expression 进行切换。

switch 语句计算表达式,将表达式的值与 case 子句匹配,并执行与该 case 相关的语句。[Ref]

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

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.');
}
&lt;script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"&gt;&lt;/script&gt;

编辑:正如 cmets 中 @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.');

【讨论】:

  • 我不介意投反对票。但请注意给出正当理由!
  • 这是一个完美的答案! ++!,也许你补充说,比较是===
  • @NinaScholz。更新!谢谢;)
  • @Rayon 只需使用if/else 级联,而不是在动态条件下打开true。更直接。
  • 感谢@Bergi 的意见。我会努力让它成为一种实践。
【解决方案2】:

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

每个案例都是一个被评估为一个值的语句。如果你look at the docs,你会看到他们有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 来确保您有整数。)

【讨论】:

    猜你喜欢
    • 2018-12-30
    • 2018-09-30
    • 1970-01-01
    • 2021-12-28
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    相关资源
    最近更新 更多