JS Switch Case - 案例块的执行功能

时间:2018-03-31 15:50:35

标签: javascript switch-statement

是否可以根据函数调用/表达式求值执行case块?

function decideRandomName(name) {
let n
    switch (name) {
        case name.toString().toUpperCase().startsWith("A"): // Is this possible?
            console.log("here")
            n = "Andshand"
            break;
        case name.toString().toUpperCase().startsWith("B"):
            n = "Bandshand"
            break;
        default:
            n = "Pandu saala"
    }
    return n;
}

执行此操作时,它始终执行默认块。如果不支持这种语法,那么我相信js会给我一个错误?有人可以在这里解释这个概念吗?

3 个答案:

答案 0 :(得分:1)

只需切换正确性:

 switch (true) { }

但是在你的情况下,你可以这样做:

 return {
  "J": "Jonas",
  "A": "Albert"
 }[name[0].toUpperCase()] || "default";

答案 1 :(得分:1)

Switch statements用于评估表达式的不同可能值。它们可以在您可能具有这样的控制流结构的地方使用:

if(someLetter === "A") {
    // do whatever for "A"
} else if (someLetter === "B") {
    // do whatever for "B"
} else if (someLetter === "C") {
    // etc.,
    // etc., and like so for D through Z
    // etc., 
} else {
    // default action
}

在您的代码中,name(大概)是一个字符串。但是,according to MDN.startsWith()会返回true或false。因此,您的案例基本上等同于case false:case false:。而且,由于name不是假的,因此您没有遇到这些情况。

我更新了您的代码,以演示switch的预期用途。

function decideRandomName(name) {
    let n;
    let firstLetter = name[0].toUpperCase();
    switch (firstLetter) {
        case "A": 
            console.log("here")
            n = "Andshand"
            break;
        case "B":
            n = "Bandshand"
            break;
        default:
            n = "Pandu saala"
            break;
    }
    return n;
}

答案 2 :(得分:0)

传递给switch的表达式(本例中为name)和每个case表达式之间的匹配与===算法相同。

由于name(假设string)和name.toString().toUpperCase().startsWith("A")boolean值)永远不会相同,因此所有案例都不匹配default块被执行。

作为一项工作,你可以像@Jonas所建议的那样做,并通过以下方式检查真相:

 switch (true) { }