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),然后按照您所做的操作,就可以维护开关