javascript - JavaScript:理解 switch 中的 case
问题描述
我在 JavaScript 中已经有一段时间了,但还有很多东西要学。
现在,我发现了一些关于Switch 语句的有趣事实。
我知道当你使用case someValue
: without break; 它在下一个案例中执行代码。
switch (x) {
case 0:
case 1:
doThis();
case 2:
doSomethingElse();
break;
}
那么,什么时候x
is 0
or 1
it 执行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)
如果它是我展示的第一种情况,那么为什么在您使用这些条件编写它时它不起作用?我展示的第二种情况只是非常不清楚的想法,它是如何工作的。
谁能给我解释一下?谢谢。
解决方案
基本上,switch
语句是具有三个通道的流,其中一个通道是外部程序流,一个检查通道和一个案例通道。
一条case
语句会发生通道的更改,该语句会严格检查语句的表达式true
和子句的值,然后您转到case 通道并停留,只要您没有到达任何一个或结束陈述。switch
case
break
switch
只要您还在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
推荐阅读
- python - 使用python访问mysql数据库中的工作日
- mysql - MySQL添加具有数字类别的列,基于另一列值和位置增加
- scala - Scala尾递归方法有一个除法和余数错误
- php - Symfony 4 认证用户令牌丢失
- javascript - Clipboard.js 循环按钮
- android - 改造预期 BEGIN_OBJECT 但在 POST 方法中是 BEGIN_ARRAY
- javascript - 如何更改 Ckeditor 的默认字体?
- python - Python - 有没有办法自动化这个?
itertools.product
- python - 如何阅读 django 调试器给我的这一行?(无反向匹配)
- ios - iOS Rxswift 处理 CancelButton 点击 searchBar