使用正则表达式实现“switch”时出错

问题描述 投票:0回答:1

以下代码片段可以用作书签,在多个网站或页面之间切换,而无需输入甚至记住它们。这是第一个版本,运行良好:

let url;
switch (location.host) {
    case 'github.com':
        url = location.href;
        url = url.replace('github.com', 'stackoverflow.com');
        window.open(url, '_self');
        break;
    case 'stackoverflow.com':
    case 'superuser.com':
    case 'unix.stackexchange.com':
        url = location.href;
        url = url.replace('/.+/', 'www.reddit.com');
        window.open(url, '_self');
        break;
    case 'www.reddit.com':
        url = location.href;
        url = url.replace('www.reddit.com', 'github.com');
        window.open(url, '_self');
        break;
}

然后我尝试进一步改进它,使其不仅适用于

unix.stackexchange
,还适用于
english.stackexchange.com
philosophy.stackexchange.com
bicycles.stackexchange.com
等等。

为此,正如 T. J. Crowder 在他 2010 年的回答中所建议的:https://stackoverflow.com/a/2896642,我添加了正则表达式。但是当我在 JavaScript 控制台中尝试它时,它会抛出一个错误:

SyntaxError: Unexpected token '.'. Expected a ')' or a ',' after a parameter declaration.
为什么会这样,这里到底出了什么问题?

function toggle(location.host) {
    let url;
    switch (true) {
        case 'github.com':
            url = location.href;
            url = url.replace('github.com', 'stackoverflow.com');
            window.open(url, '_self');
            break;
        case 'stackoverflow.com':
        case 'superuser.com':
        case /.+\.stackexchange\.com/.toggle(str):
            url = location.href;
            url = url.replace('/.+/', 'www.reddit.com');
            window.open(url, '_self');
            break;
        case 'www.reddit.com':
            url = location.href;
            url = url.replace('www.reddit.com', 'github.com');
            window.open(url, '_self');
            break;
    }
}
javascript
1个回答
0
投票

/.+\.stackexchange\.com/.toggle(str):
可能是什么意思?它确实必须抛出一些东西,因为
RegExp.toggle
是一个不存在的方法。

当您使用

switch(true)
时,应确保每个
case
都是
true
false
。否则,结果至少是不可预测的。因此,在您的情况下,我想您应该为每种情况测试正则表达式:

console.log(`location.host is ${location.host}`);
toggle(location.host);

function toggle(host) {
  let url;
  switch (true) {
    case /github\.com/i.test(host):
      url = location.href;
      url = url.replace('github.com', 'stackoverflow.com');
      return console.log(url);
    case /stackoverflow\.com/i.test(host):
    case /superuser\.com/i.test(host):
    case /stackexchange\.com/i.test(host):
      url = location.href;
      return console.log(`...${url} (unchanged)`);
    case /www\.reddit\.com/i.test(host):
      url = location.href;
      url = 'github.com';
      return console.log(url);
    case /stacksnippets\.net/i.test(host):
      return console.log(`from stackoverflow snippet box`); 
    default:
      return console.log(`no matches`);
  }
}

© www.soinside.com 2019 - 2024. All rights reserved.