Javascript 为什么这个switch语句的行为不符合预期?

Javascript 为什么这个switch语句的行为不符合预期?,javascript,switch-statement,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('n

我有以下开关块:

    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”,然后是“否”,这意味着默认块正在运行,尽管满足了第一种情况的条件


有什么问题吗?

您的
案例可能正在测试
(str.indexOf('matches')>-1)=str


编辑:

准确理解
开关
案例
的含义可能很有价值。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;
}

…这样可以更容易地消化(和/或发现)一大块代码,这些代码有效地将
类型
值映射到被调用的函数(或类似函数)。您指定的用法是检查字符串是否与多个潜在(彼此互斥?)模式中的任何一个匹配,但它不能映射到
开关
。如果它仅仅是被测试的相等性,它会工作得很好,但您的条件比
开关
设计用来表达的条件更复杂。您使用功能集保留
开关的任何方法都将有效。

您的
案例可能正在测试
(str.indexOf('matches')>-1)=str


编辑:

准确理解
开关
案例
的含义可能很有价值。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;
}

…这样可以更容易地消化(和/或发现)一大块代码,这些代码有效地将
类型
值映射到被调用的函数(或类似函数)。您指定的用法是检查字符串是否与多个潜在(彼此互斥?)模式中的任何一个匹配,但它不能映射到
开关
。如果它仅仅是被测试的相等性,它会工作得很好,但您的条件比
开关
设计用来表达的条件更复杂。您可以使用功能集保留
开关的任何方法。

为什么不使用if语句?试着这样做:

 var str = 'matches[pw1]';



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

既然你没有太多的病例,它应该会起作用。我不认为你能在案例中做比较

为什么不使用if语句?试着这样做:

 var str = 'matches[pw1]';



    if(str.indexOf('matches') > -1) {
        console.log('yes');
       break;
   }else{
       console.log(str.indexOf('matches') ) ;
       console.log('no');
       break;
  }
既然你没有太多的病例,它应该会起作用。我不认为你能在案例中做比较

您可以这样做:

console.log( str.indexOf( 'matches' ) > -1 ? 'yes' : 'no' );
您可以这样做:

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

你应该知道交换机的基本用法。我想你用错开关了。尝试按以下方式使用它:

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;
    }
请看下面的网址

如果上述不适合您的逻辑,请使用If。。否则如果。。。
您应该知道交换机的基本用法。我想你用错开关了。尝试按以下方式使用它:

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;
    }
请看下面的网址

如果上述不适合您的逻辑,请使用If。。否则如果。。。

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

不能使用switch语句执行此操作。switch语句将switch表达式(在本例中为
str
)的求值结果与case标签的值进行比较。案例标签可以是表达式(如您的示例中所示),但如果是表达式,则使用
=
计算表达式,然后与上面的值进行比较。(ECMAScript 5.1规范就是这么说的…)

因此,您的代码在这种情况下实际做的是(粗略地说):

  • 评估
    (str.indexOf('matches')>-1)
    ,它将为您提供
    true
    false
  • true
    false
    str
    的值进行比较。。。失败,并且案例主体未执行
现在,我认为您可以通过以下方式实现您的方法:

case (str.indexOf('matches') > -1 ? str : '') :
        console.log('yes');
    break;
但从代码可读性的角度(IMO)来看,很糟糕

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

不能使用switch语句执行此操作。switch语句将switch表达式(在本例中为
str
)的求值结果与case标签的值进行比较。案例标签可以是表达式(如您的示例中所示),但如果是表达式,则使用
=
计算表达式,然后与上面的值进行比较。(ECMAScript 5.1规范就是这么说的…)

因此,您的代码在这种情况下实际做的是(粗略地说):

  • 评估
    (str.indexOf('matches')>-1)
    ,它将为您提供
    true
    false
  • true
    false
    str
    的值进行比较。。。失败,并且案例主体未执行
现在,我认为您可以通过以下方式实现您的方法:

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

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

哦,那我怎么能修改它来做我需要的事情呢?我不能做case
匹配[pw1]
,因为它也可以是
匹配[somethingelse]
,因此,我需要以某种方式执行一个案例,其中
indexOf
方法应该与
匹配work@RyanFung:阿门,兄弟+1.只需将switch语句的值传递给1(true),然后按照您所做的操作,就可以维护开关