为什么这个switch语句不像预期的那样?

时间:2012-08-01 01:31:53

标签: javascript switch-statement

我有以下开关块:

    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包含单词'matches',那么它应该运行第一个case块,否则运行默认块。

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

任何想法有什么不对?

5 个答案:

答案 0 :(得分: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的任何方式都为likely require less-than-obvious code

答案 1 :(得分: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;
  }

它应该有用,因为你还没有很多案例。我认为你不能在案件中进行比较。

答案 2 :(得分: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)发臭

答案 3 :(得分:0)

你可以这样做:

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

答案 4 :(得分:0)

您应该知道交换机的基本用法。我认为你误用了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