转换

这个转换语句计算表达,将表达式的值与一系列案例子句,并执行报表在第一次之后案例子句,直到打破遇到语句。这个违约a的子句转换如果没有,语句将跳转到案例匹配表达式的值。

试试看

语法

js型
转换 (表达) {
  案例 case表达式1:声明案例 case表达式2:声明// …
  案例 case表达式N:声明违约:声明}
表达

结果与每个匹配的表达式案例条款。

case case表达式N 可选

A类案例用于匹配的子句表达。如果表达匹配任何case表达式N,执行从后面的第一条语句开始案例子句,直到转换语句或遇到的第一个语句打破.

违约 可选

A类违约条款;如果提供,如果表达与任何案例条款。A类转换语句只能有一个违约条款。

描述

A类转换语句首先计算其表达式。然后查找第一个案例子句,其表达式的计算结果与输入表达式的结果相同(使用严格平等并将控制权转移到该子句,执行该子句后面的所有语句。

只有在必要时才计算子句表达式-如果已经找到匹配项,则随后案例子句表达式将不会被求值,即使它们将被访问故障排除.

js型
转换 (未定义) {
  案例慰问.日志(1):
  案例慰问.日志(2):
}
//仅日志1

如果没有匹配案例子句时,程序将查找可选的违约子句,如果找到,则将控制权转移给该子句,执行该子句后面的语句。如果没有违约子句,则程序继续在转换根据惯例违约子句是最后一个子句,但不一定是这样转换语句只能有一个违约条款;倍数违约子句将导致语法错误.

突破和突破

您可以使用打破中的语句转换语句体提前爆发,通常当两个语句之间的所有语句案例条款已执行。执行将在以下第一条语句中继续转换.

如果打破则执行将继续到下一个案例条款,甚至对违约子句,无论该子句表达式的值是否匹配。这种行为称为“失败”。

js型
常数foo公司= 0;
转换 (foo公司) {
  案例 -1:慰问.日志(“负1”);
    打破;
  案例 0: //foo值符合此标准;执行从这里开始慰问.日志(0);
  //忘记休息了!执行失败
  案例 1: //“case 0:”中没有break语句,因此此case也将运行慰问.日志(1);
    打破; //遇到中断;不会继续到“案例2:”
  案例 2:慰问.日志(2);
    打破;
  违约:慰问.日志(“默认”);
}
//日志0和1

在适当的上下文中,其他控制流语句也会破坏转换声明。例如,如果转换语句包含在函数中,然后返回语句终止函数体的执行,因此转换声明。如果转换语句包含在循环中,然后持续语句停止转换语句并跳转到循环的下一个迭代。

词汇范围

这个案例违约子句类似标签:它们指示控制流可能跳转到的位置。但是,它们不会创建词汇范围他们自己(也不会自动爆发——如上所述)。例如:

js型
常数行动= “打招呼”;
转换 (行动) {
  案例 “打招呼”:
    常数消息= “你好”;慰问.日志(消息);
    打破;
  案例 “打个招呼”:
    常数消息= “嗨”;慰问.日志(消息);
    打破;
  违约:慰问.日志(“收到空操作。”);
}

此示例将输出错误“Uncaught SyntaxError:Identifier'message'has already been declared”,因为第一个const消息=“hello”;与第二个冲突const消息=“hi”;声明,即使它们在各自的case子句中。归根结底,这都是由于常数声明位于由转换车身。

为了解决这个问题,无论何时您需要使用常数中的声明案例子句,将其包装在块中。

js型
常数行动= “打招呼”;
转换 (行动) {
  案例 “打招呼”: {
    常数消息= “你好”;慰问.日志(消息);
    打破;
  }
  案例 “打个招呼”: {
    常数消息= “嗨”;慰问.日志(消息);
    打破;
  }
  违约: {慰问.日志(“收到空操作。”);
  }
}

此代码现在将输出你好在控制台中,没有任何错误。

示例

使用交换机

在以下示例中,如果快递计算结果为香焦,程序将值与大小写匹配香蕉盒并执行关联的语句。何时打破遇到时,程序中断转换并执行以下语句转换.如果打破被省略“樱桃”案例也将被执行。

js型
转换 (快递) {
  案例 “橙子”:慰问.日志(“橙子每磅0.59美元。”);
    打破;
  案例 “苹果”:慰问.日志(“苹果每磅0.32美元。”);
    打破;
  案例 “香蕉”:慰问.日志(“香蕉每磅0.48美元。”);
    打破;
  案例 “樱桃”:慰问.日志(“樱桃每磅3.00美元。”);
    打破;
  案例 “芒果”:
  案例 “木瓜”:慰问.日志(“芒果和木瓜每磅2.79美元。”);
    打破;
  违约:慰问.日志(`对不起,我们没货了${快递}.`);
}慰问.日志(“你还有其他想要的吗?”);

将default子句置于两个case子句之间

如果未找到匹配项,将从违约子句,然后执行其后的所有语句。

js型
常数foo公司= 5;
转换 (foo公司) {
  案例 2:慰问.日志(2);
    打破; //它遇到此中断,因此不会继续进入“default:”
  违约:慰问.日志(“默认”);
  //故障排除
  案例 1:慰问.日志("1");
}

当你把违约在所有其他人之前案例条款。

利用故障排除

此方法利用了以下事实:如果没有打破低于a案例条款,执行将继续到下一个案例条款,无论是否案例符合标准。

以下是单个操作顺序的示例案例语句,其中四个不同的值执行完全相同。

js型
常数动物= “长颈鹿”;
转换 (动物) {
  案例 “奶牛”:
  案例 “长颈鹿”:
  案例 “狗”:
  案例 “猪”:慰问.日志(“这种动物还没有灭绝。”);
    打破;
  案例 “恐龙”:
  违约:慰问.日志(“这种动物已经灭绝了。”);
}

以下是多操作序列的示例案例子句中,根据提供的整数,您可以接收不同的输出。这表明它将按照您放置案例子句,并且它不必是数字顺序的。在JavaScript中,您甚至可以将字符串的定义混合到案例声明。

js型
常数foo公司= 1;
输出= “输出:”;
转换 (foo公司) {
  案例 0:输出+= “所以”;
  案例 1:输出+= “什么”;输出+= “是”;
  案例 2:输出+= “您的”;
  案例 :输出+= “姓名”;
  案例 4:输出+= "?";慰问.日志(输出);
    打破;
  案例 5:输出+= "!";慰问.日志(输出);
    打破;
  违约:慰问.日志(“请选择一个从0到5的数字!”);
}

此示例的输出:

价值 日志文本
foo公司NaN公司或者不是1,2,,4,5,或0 请从0到5中选择一个数字!
0 输出:那么你叫什么名字?
1 输出:你叫什么名字?
2 输出:你的名字?
输出:名称?
4 输出:?
5 输出:!

替代if…else链

你可能经常会发现自己在做一系列如果…其他比赛。

js型
如果 (“获取” 在里面全球This) {
  //使用Fetch获取资源
} 其他的 如果 (“XMLHttpRequest” 在里面全球This) {
  //使用XMLHttpRequest获取资源
} 其他的 {
  //使用一些自定义AJAX逻辑获取资源
}

此模式不执行序列===比较,但您仍然可以将其转换为转换构造。

js型
转换 (真的) {
  案例 “获取” 在里面 全球This:
    //使用Fetch获取资源
    打破;
  案例 “XMLHttpRequest” 在里面 全球This:
    //使用XMLHttpRequest获取资源
    打破;
  违约:
    //使用一些自定义AJAX逻辑获取资源
    打破;
}

这个开关(真)模式作为如果…其他如果您想利用这个fall-through行为,它特别有用。

js型
转换 (真的) {
  案例 是方形的(形状):慰问.日志(“这个形状是正方形。”);
  //简单,因为正方形也是矩形!
  案例 是矩形(形状):慰问.日志(“这个形状是一个矩形。”);
  案例 是四边形的(形状):慰问.日志(“这个形状是四边形。”);
    打破;
  案例 isCircle公司(形状):慰问.日志(“这个形状是一个圆。”);
    打破;
}

规格

规范
ECMAScript语言规范
#安全开关状态

浏览器兼容性

BCD表仅在浏览器中加载

另请参见