JavaScript:理解 switch 中的情况

Hac*_*rrr 5 javascript scope

我使用 JavaScript 一段时间了,但还有很多东西需要学习。

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

我知道当你使用case someValue: without break;时 它在下一种情况下执行代码。

switch (x) {
  case 0:
  case 1:
    doThis();
  case 2:
    doSomethingElse();
    break;
}
Run Code Online (Sandbox Code Playgroud)

那么,什么时候x01执行doThis(),甚至doSomethingElse()但为什么呢?
JavaScript 会把它解释成这样:

switch (x) {
  case (0 == x || 1 == x): 
    doThis();
    doSomethingElse();
    break;
  case (2 == x):
    doSomethingElse();
    break;
}
Run Code Online (Sandbox Code Playgroud)

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

switch (x) {
  case 0: {
    case 1: {
      doThis();
      case 2: {
        doSomethingElse();
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

有人可以向我解释一下吗?谢谢。

Nin*_*olz 4

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

一条语句会发生车道的更改case,该语句会严格检查true语句的表达式和子句的值,然后您将转到case 车道并保持不变,只要您未到达该语句或语句的末尾即可。陈述。switchcasebreakswitch

只要您仍在检查通道中,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
Run Code Online (Sandbox Code Playgroud)