是否可以根据函数调用/表达式求值执行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会给我一个错误?有人可以在这里解释这个概念吗?
答案 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) { }