首页 > 解决方案 > JavaScript:理解 switch 中的 case

问题描述

我在 JavaScript 中已经有一段时间了,但还有很多东西要学。

现在,我发现了一些关于Switch 语句的有趣事实。

我知道当你使用case someValue: without break; 它在下一个案例中执行代码。

switch (x) {
  case 0:
  case 1:
    doThis();
  case 2:
    doSomethingElse();
    break;
}

那么,什么时候xis 0or 1it 执行doThis()and even doSomethingElse()但是为什么呢?.
JavaScript 会将其解释为如下内容:

switch (x) {
  case (0 == x || 1 == x): 
    doThis();
    doSomethingElse();
    break;
  case (2 == x):
    doSomethingElse();
    break;
}

或者它为每种情况创建代码块,直到出现 brek,如下所示:

switch (x) {
  case 0: {
    case 1: {
      doThis();
      case 2: {
        doSomethingElse();
      }
    }
  }
}

陈述将可能是这样的:(x === 0 && x == 0) || x === 1 && x == 1)

如果它是我展示的第一种情况,那么为什么在您使用这些条件编写它时它不起作用?我展示的第二种情况只是非常不清楚的想法,它是如何工作的。

谁能给我解释一下?谢谢。

标签: javascriptscope

解决方案


基本上,switch语句是具有三个通道的流,其中一个通道是外部程序流,一个检查通道和一个案例通道

一条case语句会发生通道的更改,该语句会严格检查语句的表达式true和子句的值,然后您转到case 通道并停留,只要您没有到达任何一个或结束陈述。switchcasebreakswitch

只要您还在check lane中,其他 check 之间或 end 之间的任何break语句都没有任何效果。

                        out    lane  lane
code                    side  check  case  comment
---------------------  -----  -----  ----  -------------------------------------------------
                          v
switch (x) {              v >>>  v       
  case 0:                        ? >>> v   if case is true, change lane
  case 1:                        ? >>> v   if case is true, change lane
    doThis();                    v     v
  case 2:                        ? >>> v   if case is true, change lane
    doSomethingElse();           v     v
    break;                v <<<<<<<<<< .   break statement, back to program flow
  default:                v      ? >>> v   change lane if value is not in other case clauses
                          v      v
}                         v <<<  .         end of switch
                          v

推荐阅读