在javascript中,Switch case跳转到错误的case(如何正确使用break命令)

在javascript中,Switch case跳转到错误的case(如何正确使用break命令),javascript,switch-statement,Javascript,Switch Statement,我的代码不是很长,所以我把它全部粘贴在这里 代码不完整,但当我运行它时,它首先跳转到它应该使用的case“start”,然后跳转到case“end”。我可以看到它,因为它打印两个块的控制台日志文本。为什么要跳到“终点”呢 函数步骤流(流,步骤){ 开关(流[步]){ 案例“开始”: log(“开始读取流…”); 案例“结束”: var success=“已完成读取数据流。”; console.log(成功); 回归成功; 违约: 抛出“数据流格式不好”; 案例“手势”: log(“运行案例手势

我的代码不是很长,所以我把它全部粘贴在这里

代码不完整,但当我运行它时,它首先跳转到它应该使用的case“start”,然后跳转到case“end”。我可以看到它,因为它打印两个块的控制台日志文本。为什么要跳到“终点”呢


函数步骤流(流,步骤){
开关(流[步]){
案例“开始”:
log(“开始读取流…”);
案例“结束”:
var success=“已完成读取数据流。”;
console.log(成功);
回归成功;
违约:
抛出“数据流格式不好”;
案例“手势”:
log(“运行案例手势!但为什么?”);
步骤+=1;
stepStream(stream,step);
案例“说”:
步骤+=1;
stepStream(stream,step);
案例“睡眠”:
步骤+=1;
stepStream(stream,step);
}
}
var sentence1=“我的香蕉在哪里?我以为你把它们放在我的包里了?”;
var sentence2=“这是一个相当令人恼火的情况。”;
var dataStream=[“开始”,“手势”,“版仔”,“睡眠”,1.0,“说”,句子1,
“说”,第2句,“手势”,“库比卡什”,“结束”];
stepStream(数据流,0)//第二个参数设置从何处开始读取数据流。

问题是您在
案例
代码之后缺少
break
关键字。如果没有中断,将执行后续块,这就是为什么
end
start
代码之后执行
end
的原因。您可以在上阅读更多关于此的信息

此外,从:

与每个案例标签关联的可选break语句可确保 一旦匹配的语句被激活,程序就会跳出开关 在开关后面的语句处执行并继续执行。如果 如果省略break,程序将在下一个 switch语句中的语句

因此,您的代码应该如下所示:

function stepStream(stream,step){
                switch (stream[step]){
                    case "start":
                        console.log("Started reading stream...");
                        break;
                    case "end":
                        var success = "Finished reading dataStream.";
                        console.log(success);
                        return success;
                    default:
                        throw "Data stream format is bad";                  
                    case "gesture":
                        //commUGesture(stream[i+1]);
                        //createLogLine("robot:CommU","event:gesture:"+stream[i+1]);
                        console.log("Running case gesture! But why?");
                        step+=1;
                        stepStream(stream,step);
                        break;
                    case "say":
                        step+=1;
                        stepStream(stream,step);
                        break;
                    case "sleep":
                        step+=1;
                        stepStream(stream,step);
                        break;
                }

您的“end”案例在结尾有一个返回,因此代码不会落入其他案例。理想情况下,在每个代码的末尾都应该有一个中断。

您忘记在开始块中添加中断语句,因此它会一直到结束块。

问题很简单,所有的
开关案例
都必须以缺少的
中断
返回
语句结束

switch(var1)
{
    case "start":
        console.log("Started");
        break;
    case "end":
         console.log("stopped");
         return "";
     .
     .
     .
}

代码将在第一个匹配的“case”处开始运行,但只有在达到“break”或“return”语句时才会停止运行

您需要在每个
案例的结尾处使用
break
(除了那些已经以
return
throw
结尾的案例):。可能重复的是啊,好吧,明白了,但为什么我通过的唯一案例是“start”?却要进入“end”案例?因为您没有中断。之后的案例是否匹配并不重要。将执行所有代码,直到下一个中断(或返回、抛出)。我在回答中又补充了一些信息。希望有帮助!谢谢,切换功能感觉像是一个危险的功能,但使用起来并不真的,它已经成为一种习惯,在每种情况下,你使用它的次数越多,它就会被打破。就像放分号或括号一样。我相信你会发现它很有用:)
switch(var1)
{
    case "start":
        console.log("Started");
        break;
    case "end":
         console.log("stopped");
         return "";
     .
     .
     .
}