0

我有以下开关块:

    var str = 'matches[pw1]';

    switch (str)
    {
        case (str.indexOf('matches') > -1) :
            console.log('yes');
        break;

       default:
           console.log(str.indexOf('matches') ) ;
           console.log('no');
        break;
    }

我想要的是,如果str包含“匹配”这个词,那么它应该运行第一个 case 块,否则运行默认块。

但是,当我运行它时,我得到的输出是“0”,然后是“否”,这意味着默认块正在运行,尽管满足第一种情况的条件。

有什么想法有什么问题吗?

4

5 回答 5

3

case可能正在测试是否(str.indexOf('matches') > -1) == str.


编辑:

准确理解什么switchcase意思可能很有价值。Javascript 的祖先之一,C,通常用于switch替换将原语与值列表(通常来自一个enum迭代或一系列文字)进行比较的代码块。所以而不是:

if (type == ENABLE_FRAMISTAN)
{
   enable_framistan();
}
else if (type == ENABLE_FROBSOSTICATOR)
{
   enable_frobnosticator();
}
else if (type == DISABLE_BAZTICULATOR)
{
   disable_bazticulator();
}
else
{
   assert(false);
}

你可以改为写:

switch (type)
{
    case ENABLE_FRAMISTAN:      enable_framistan(); break;
    case ENABLE_FROBNOSTICATOR: enable_frobnosticator(); break;
    case DISABLE_BAZTICULATOR:  disable_bazticulator(); break;
    default: assert(false);  break;
}

...这可能更容易消化(和/或发现错误)一大块代码,这些代码有效地type将值映射到被调用的函数(或类似的函数)。您指定的用法,检查一个字符串是否与许多潜在的(互斥的?)模式中的任何一个匹配,也不会映射到switch. 如果只是测试平等,它会很好地工作,但你的条件比switch设计表达的要复杂。您设法通过switch功能集保留的任何方式都可能需要不太明显的代码

于 2012-08-01T01:35:46.603 回答
2

为什么不使用 if 语句?尝试这样的事情:

 var str = 'matches[pw1]';



    if(str.indexOf('matches') > -1) {
        console.log('yes');
       break;
   }else{
       console.log(str.indexOf('matches') ) ;
       console.log('no');
       break;
  }

它应该可以工作,因为无论如何你没有很多案例。我认为您无法在案例中进行比较。

于 2012-08-01T01:36:54.860 回答
1

我想要的是,如果 str 包含单词“matches”,那么它应该运行第一个 case 块,否则运行默认块。

你不能用 switch 语句来做到这一点。switch 语句将评估 switch 表达式(在本例中str)的结果与 case 标签的值进行比较。案例标签可以是表达式(如您的示例中所示),但如果它们是表达式,则会对其进行评估,然后使用===. (这就是 ECMAScript 5.1 规范所说的......)

因此,您的代码实际上为这种情况做了什么(粗略地说):

  • 评估(str.indexOf('matches') > -1)哪个给你truefalse
  • 比较truefalsestr... 的值失败并且不执行案例主体。

现在我认为你可以让你的方法如下工作:

case (str.indexOf('matches') > -1 ? str : '') :
        console.log('yes');
    break;

但从代码可读性的角度(IMO)来看,这很糟糕。

于 2012-08-01T01:52:14.443 回答
0

你应该知道switch的基本用法。我认为您错误地使用了 Switch。尝试如下使用它:

var str = 'matches[pw1]';
str = str.indexOf('matches');
switch (str)
    {
        case  -1 :
            console.log('yes');
        break;

       default:
           console.log(str.indexOf('matches') ) ;
           console.log('no');
        break;
    }

请看以下网址http://www.w3schools.com/js/js_switch.asp

如果以上不适合您的逻辑,请使用 if.. else if ... http://www.w3schools.com/js/js_if_else.asp

于 2012-08-01T01:46:36.177 回答
0

你可以这样做:

console.log( str.indexOf( 'matches' ) > -1 ? 'yes' : 'no' );
于 2012-08-01T01:38:17.340 回答