我有一个 switch 语句,它根据当前 url 路径运行逻辑。它有一个默认情况,如果其他情况都不匹配,则考虑计算值(例如正则表达式匹配):
const pathname = document.location.pathname;
switch (pathname) {
case "/foo": //...
case "/bar": //...
case "/baz": //...
default:
if (/^\/user\/\w+\/likes/.test(pathname)) {
// ...
}
else if (/^\/blog\/\d+/.test(pathname)) {
// ...
}
}
有人建议我更改它以省略default
并使用条件作为我的情况:
switch (true) {
case pathname === "/foo": //. ..
case pathname === "/bar": // ...
case pathname === "/baz": // ...
case /^\/user\/\w+\/likes/.test(pathname): // ...
case /^\/blog\/\d+/.test(pathname): // ...
}
我想确定其中哪一个具有更好的运行时复杂性。老实说,我以前从未见过这样的东西,所以我不知道它是如何工作的。我知道Java将 switch 语句编译为查找表,但 JavaScript 未编译,因此它可能不使用查找表。
如果 JS确实使用查找表,第一个选项(使用default
)可能会执行得更好,因为 case 语句都使用可以散列的常量值。如果它指出在匹配之前评估表达式是正确的,那么第二个可能会表现更差(取决于表达式的数量)。
那么为什么其中一个的运行时复杂度可能比另一个更好呢?它到底是如何工作的?