转换

基线 广泛可用

此功能已得到很好的建立,可在许多设备和浏览器版本中使用。从那时起,它就可以跨浏览器使用了 2015年7月.

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

试试看

const expr=“木瓜”;开关(expr){“橙子”案例:log(“橙子每磅0.59美元。”);断裂;案例“芒果”:“木瓜”案例:log(“芒果和木瓜每磅2.79美元。”);//预期产量:“芒果和木瓜每磅2.79美元。”断裂;违约:console.log(`抱歉,${expr}.`已用完);}

语法

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

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

案例表达N 可选

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

违约 可选

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

描述

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

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

js型
开关(未定义){案例控制台.log(1):案例控制台.log(2):}//仅日志1

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

突破和突破

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

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

js型
常量foo=0;交换机(foo){案例-1:console.log(“负1”);断裂;case 0://foo的值符合此条件;执行从这里开始console.log(0);//忘记休息了!执行失败case 1://“case 0:”中没有break语句,因此此案例也将运行console.log(1);断裂;//遇到中断;不会继续到“案例2:”案例2:console.log(2);断裂;违约:console.log(“默认”);}//日志0和1

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

词汇范围

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

js型
const动作=“say_hello”;开关(动作){案例“say_hello”:const消息=“hello”;console.log(消息);断裂;案例“say_hi”:const消息=“hi”;console.log(消息);断裂;违约:console.log(“接收到空操作。”);}

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

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

js型
const动作=“say_hello”;开关(动作){案例“say_hello”:{const消息=“hello”;console.log(消息);断裂;}案例“say_hi”:{const消息=“hi”;console.log(消息);断裂;}默认值:{console.log(“接收到空操作。”);}}

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

示例

使用交换机

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

js型
开关(expr){“橙子”案例:log(“橙子每磅0.59美元。”);断裂;“苹果”案例:log(“苹果每磅0.32美元。”);断裂;“香蕉”盒:log(“香蕉每磅0.48美元。”);断裂;“樱桃”案例:log(“樱桃每磅3.00美元。”);断裂;案例“芒果”:案例“木瓜”:log(“芒果和木瓜每磅2.79美元。”);断裂;违约:console.log(`抱歉,${expr}.`已用完);}log(“您还想要什么吗?”);

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

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

js型
常数foo=5;交换机(foo){案例2:console.log(2);断裂;//它遇到此中断,因此不会继续进入“default:”违约:console.log(“默认”);//故障排除案例1:console.log(“1”);}

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

利用故障排除

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

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

js型
const Animal=“长颈鹿”;开关(动物){案例“Cow”:案例“长颈鹿”:案例“Dog”:案例“Pig”:log(“这种动物没有灭绝。”);断裂;“恐龙”案例:违约:log(“这种动物已经灭绝了。”);}

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

js型
常数foo=1;let output=“output:”;交换机(foo){案例0:输出+=“So”;案例1:输出+=“什么”;输出+=“是”;案例2:output+=“您的”;情况3:output+=“名称”;案例4:输出+=“?”;console.log(输出);断裂;案例5:输出+=“!”;console.log(输出);断裂;违约:console.log(“请选择0到5之间的数字!”);}

此示例的输出:

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

替代if…else链

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

js型
if(globalThis中的“fetch”){//使用Fetch获取资源}else if(globalThis中的“XMLHttpRequest”){//使用XMLHttpRequest获取资源}其他{//使用一些自定义AJAX逻辑获取资源}

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

js型
开关(真){global中的case“fetch”This://使用Fetch获取资源断裂;globalThis中的case“XMLHttpRequest”://使用XMLHttpRequest获取资源断裂;违约://使用一些自定义AJAX逻辑获取资源断裂;}

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

js型
开关(真){外壳为方形(形状):log(“这个形状是一个正方形。”);//简单,因为正方形也是矩形!外壳为矩形(形状):log(“这个形状是一个矩形。”);外壳为四边形(形状):log(“这个形状是四边形。”);断裂;外壳为圆形(形状):log(“这个形状是一个圆。”);断裂;}

规格

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

浏览器兼容性

另请参见