如何为以下条件编写开关?
如果 url 包含“foo”,则 settings.base_url
为“bar”。
以下是实现所需的效果,但我觉得这在开关中会更易于管理:
var doc_location = document.location.href;
var url_strip = new RegExp("http:\/\/.*\/");
var base_url = url_strip.exec(doc_location)
var base_url_string = base_url[0];
//BASE URL CASES
// LOCAL
if (base_url_string.indexOf('xxx.local') > -1) {
settings = {
"base_url" : "http://xxx.local/"
};
}
// DEV
if (base_url_string.indexOf('xxx.dev.yyy.com') > -1) {
settings = {
"base_url" : "http://xxx.dev.yyy.com/xxx/"
};
}
原文由 Dr. Frankenstein 发布,翻译遵循 CC BY-SA 4.0 许可协议
除非您进行 完整 的字符串匹配,否则您无法在
switch
中执行此操作;那是在做 子字符串 匹配。 (这并不 完全 正确,正如肖恩在评论中指出的那样。见最后的注释。)如果您很高兴顶部的正则表达式删除了您不想在匹配中比较的所有内容,那么您不需要子字符串匹配,并且可以这样做:
…但同样,只有当这是您匹配的 完整 字符串时才有效。如果
base_url_string
是“yyy.xxx.local”,而您当前的代码将与“xxx.local”分支中的代码匹配,它将失败。更新:好的,所以从技术上讲,您 可以 使用
switch
进行子字符串匹配,但在大多数情况下我不推荐它。以下是方法( 现场示例):这是因为 JavaScript
switch
语句的工作 方式,特别是两个关键方面:首先,按照 源文本 顺序考虑 case,其次,选择器 _表达式_(关键字case
之后的位)是被评估为case 被评估(不是像其他一些语言中的常量)。因此,由于我们的测试表达式为true
,因此第一个结果为true
的case
表达式将被使用。