精讲 JavaScript 的 "switch" 语句

"switch" 语句

switch 语句能够替代多个 if 判断。javascript

switch 语句为多分支选择的状况提供了一个更具描述性的方式。html

语法

switch 语句有至少一个 case 代码块和一个可选的 default 代码块。java

就像这样:react

switch(x) {
  case 'value1':  // if (x === 'value1')
    ...
    [break]

  case 'value2':  // if (x === 'value2')
    ...
    [break]

  default:
    ...
    [break]
}
复制代码
  • 比较 x 值与第一个 case(也就是 value1)是否严格相等,而后比较第二个 casevalue2)以此类推。
  • 若是相等,switch 语句就执行相应 case 下的代码块,直到遇到最靠近的 break 语句(或者直到 switch 语句末尾)。
  • 若是没有符合的 case,则执行 default 代码块(若是 default 存在)。

举个例子

switch 的例子(执行 case 4 部分):微信

let a = 2 + 2;

switch (a) {
  case 3:
    alert( 'Too small' );
    break;
  case 4:
    alert( 'Exactly!' );
    break;
  case 5:
    alert( 'Too large' );
    break;
  default:
    alert( "I don't know such values" );
}
复制代码

这里的 switch 从第一个 case 分支开始将 a 的值与 case 后的值进行比较,第一个 case 后的值为 3 匹配失败。学习

而后比较 4。匹配,因此从 case 4 开始执行直到遇到最近的 breakthis

若是没有 break,程序将不通过任何检查就会继续执行下一个 casespa

break 的例子:code

let a = 2 + 2;

switch (a) {
  case 3:
    alert( 'Too small' );
  case 4:
    alert( 'Exactly!' );
  case 5:
    alert( 'Too big' );
  default:
    alert( "I don't know such values" );
}
复制代码

在上面的例子中咱们会看到连续执行的三个 alertcdn

alert( 'Exactly!' );
alert( 'Too big' );
alert( "I don't know such values" );
复制代码

任何表达式均可以成为 switch/case 的参数

switchcase 都容许任意表达式。

好比:

let a = "1";
let b = 0;

switch (+a) {
  case b + 1:
    alert("this runs, because +a is 1, exactly equals b+1");
    break;

  default:
    alert("this doesn't run");
}
复制代码

这里 +a 返回 1,这个值跟 caseb + 1 相比较,而后执行对应的代码。


"case" 分组

共享同一段代码的几个 case 分支能够被分为一组:

好比,若是咱们想让 case 3case 5 执行一样的代码:

let a = 2 + 2;

switch (a) {
  case 4:
    alert('Right!');
    break;

  case 3: // (*) 下面这两个 case 被分在一组
  case 5:
    alert('Wrong!');
    alert("Why don't you take a math class?");
    break;

  default:
    alert('The result is strange. Really.');
}
复制代码

如今 35 都显示相同的信息。

switch/case 有经过 case 进行“分组”的能力,实际上是 switch 语句没有 break 时的反作用。由于没有 breakcase 3 会从 (*) 行执行到 case 5

类型很关键

强调一下,这里的相等是严格相等。被比较的值必须是相同的类型才能进行匹配。

好比,咱们来看下面的代码:

let arg = prompt("Enter a value?")
switch (arg) {
  case '0':
  case '1':
    alert( 'One or zero' );
    break;

  case '2':
    alert( 'Two' );
    break;

  case 3:
    alert( 'Never executes!' );
    break;
  default:
    alert( 'An unknown value' )
}
复制代码
  1. prompt 对话框输入 01,第一个 alert 弹出。
  2. 输入 2,第二个 alert 弹出。
  3. 可是输入 3,由于 prompt 的结果是字符串类型的 "3",不严格相等 === 于数字类型的 3,因此 case 3 不会执行!所以 case 3 部分是一段无效代码。因此会执行 default 分支。

做业题

先本身作题目再看答案。

1. 将 "switch" 结构重写为 "if" 结构

重要程度:⭐️⭐️⭐️⭐️⭐️

将下面 "switch" 结构的代码写成 if..else 结构:

switch (browser) {
  case 'Edge':
    alert( "You've got the Edge!" );
    break;

  case 'Chrome':
  case 'Firefox':
  case 'Safari':
  case 'Opera':
    alert( 'Okay we support these browsers too' );
    break;

  default:
    alert( 'We hope that this page looks ok!' );
}
复制代码

2. 将 "if" 结构重写为 "switch" 结构

重要程度:⭐️⭐️⭐️⭐

switch 重写如下代码:

let a = +prompt('a?', '');

if (a == 0) {
  alert( 0 );
}
if (a == 1) {
  alert( 1 );
}

if (a == 2 || a == 3) {
  alert( '2,3' );
}
复制代码

答案:

在微信公众号「技术漫谈」后台回复 1-2-13 获取本题答案。


现代 JavaScript 教程:开源的现代 JavaScript 从入门到进阶的优质教程。React 官方文档推荐,与 MDN 并列的 JavaScript 学习教程

在线免费阅读:zh.javascript.info


扫描下方二维码,关注微信公众号「技术漫谈」,订阅更多精彩内容。

相关文章
相关标签/搜索