gpt4 book ai didi

javascript - 为什么使用 Switch 时需要 Break?

转载 作者:行者123 更新时间:2023-12-03 18:53:56 26 4
gpt4 key购买 nike

我已经阅读了很多关于 SO 的答案,但似乎无法找到一个明确的答案来解释为什么在这种情况下如果省略了 break,那么情况“C”将始终被评估为 true,而填充的新数组只会“G” ”的。我清楚地知道,这里最好使用 break ,因为我只是想评估一个特定的匹配,而不是如果确实省略了 break ,为什么最后一种情况总是正确的。

 var dna = "ATTGC";
var outArr = [];
dna.split("").forEach(function(e,i){
switch(e) {
case "G": outArr[i] = "C"; break;
case "T": outArr[i] = "A"; break;
case "A": outArr[i] = "T"; break;
case "C": outArr[i] = "G"; break;
}
console.log(outArr);
})

最佳答案

来自 MDN

If a match is found, the program executes the associated statements. If multiple cases match the provided value, the first case that matches is selected, even if the cases are not equal to each other.

The optional break statement associated with each case label ensures that the program breaks out of switch once the matched statement is executed and continues execution at the statement following switch. If break is omitted, the program continues execution at the next statement in the switch statement.


所以关于 Switch 的基本历史是它起源于 C 并且是 branch table 的抽象。并且分支表也有隐式的失败,需要额外的跳转指令来避免它。
此外,所有其他语言都继承了 switch 作为默认的 C switch 语义,大多选择默认保留 C 语义。
因此,如果在所有情况下都省略了 break,则在您的 switch 中,如果找到匹配项,则程序将继续执行下一条语句。找到匹配后它不会从 switch 退出,而是评估匹配情况下的所有其他情况,因为解析器认为情况是合并的,因为它们之间没有中断。
为了清楚地解释这种行为,我对您的代码进行了一些修改。如果省略了中断。
var dna = "ATTGC";
var outArr = [];
dna.split("").forEach(function(e,i){
switch(e) {
case "G": outArr[i] = "C"; break;
case "T": outArr[i] = "A"; break;
case "A": outArr[i] = "T";
case "C": outArr[i] = "G"; break;
}
console.log(outArr);
})
所以你的输出会像
["G"]
["G", "A"]
["G", "A", "A"]
["G", "A", "A", "C"]
["G", "A", "A", "C", "G"]
在第一次迭代中,匹配将针对案例 A。
outArr={'T'}
同样,由于没有 break 语句,它会将 Case C 视为同一 block 并继续执行。现在
outArr={'G'}
同样在第二次迭代中,它与 case T 匹配,但有一个 break 语句,因此控件跳出 switch,outarr 现在将是
outArr={'G','A'}
同样,对于其他迭代,您将获得上面发布的整个输出。

Updated Bin here

关于javascript - 为什么使用 Switch 时需要 Break?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39757797/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com