如何在javascript switch-case函数中使用!-1

时间:2011-06-04 17:47:25

标签: javascript

我“想”使用开关,但是当我以这种方式使用它时,我似乎无法使它工作。谁知道为什么?

var mystring='my name is johnny';  
switch (!-1) {  
          case mystring.indexOf('hello'):  
        alert('hello');  
        break;  
    case mystring.indexOf('goodbye'):  
        alert('goodbye');  
        break;  
    case mystring.indexOf('johnny'):  
        alert('johnny');  
        break;  
    default:  
        alert('default');           
}  

它总是提醒“默认”,但你可以看到我希望它提醒“johnny”

7 个答案:

答案 0 :(得分:8)

免责声明:此开关是 evil 。使用if / else-if语句。但如果你必须使用开关,可以这样做:

switch (true) {  
    case /hello/.test(mystring):  
        alert('hello');  
        break;  
    case /goodbye/.test(mystring):  
        alert('goodbye');  
        break;  
    case /johnny/.test(mystring):  
        alert('johnny');  
        break;  
    default:  
        alert('default');           
}  

应该按照您的意愿工作。

.test

我很想进一步重构它。

function Parse(str) {
    var logic = {
        "hello": function(str) { alert("hello"); }
        /*, ... */
    }

    for (var k in logic) {
        if ((new RegExp(k)).test(str)) {
            logic[k](str);
        }
    }
}

Parse("Hello I am johnny");

答案 1 :(得分:5)

!-1-1强制转换为布尔值,然后将其否定,所以

switch(!-1)
{
    // stuff
}

相当于

switch(false)
{
    // stuff
}

由于没有case false,因此始终会执行default。这真的不是使用开关的正确方法 - switch在常量表达式中没有任何意义。

为什么“想要”使用switch


以下是如何正确实现它:

var mystring='my name is johnny';

if (mystring.indexOf('hello') !== -1) alert('hello');
else if (mystring.indexOf('goodbye') !== -1) alert('goodbye');
else if (mystring.indexOf('johnny') !== -1) alert('johnny');

或者,减少重复性,

var mystring='my name is johnny',
    words = ['hello', 'goodbye', 'johnny'],
    word;

while (word = words.shift(), mystring.indexOf(word) === -1);

word = word || 'default';
alert(word);

答案 2 :(得分:3)

“not”(!)和“-1”的组合似乎有问题。您需要将它们移动到您的案例中

var mystring='my name is johnny';  
switch (true) {  
          case mystring.indexOf('hello') != -1:  
        alert('hello');  
        break;  
    case mystring.indexOf('goodbye') != -1:  
        alert('goodbye');  
        break;  
    case mystring.indexOf('johnny') != -1:  
        alert('johnny');  
        break;  
    default:  
        alert('default');           
}

PHP很痛苦,strpos(...)在找不到false时返回0,当字符串从它开始时==(这两个值是===,但不是{{} 1}})但我个人觉得JavaScripts indexOf(..) == -1更糟糕。 (为什么不能falsenull?)

答案 3 :(得分:0)

这里发生的是switch !-1的{​​{1}}结果,case找不到switch-case。 {{1}}似乎不是在这里使用的正确结构。

答案 4 :(得分:0)

表达式!-1只评估为false

您正尝试将x != -1之类的比较转换为x == !-1,但!运算符不会否定比较,只会取消值。

答案 5 :(得分:0)

我认为你的实施是正确的。要使用的正确条件语句是 if ...... else

  

var mystring ='我的名字是johnny&#39 ;;

     

if(mystring.indexOf(' hello')!= -1)   警报('你好');   
否则if(mystring.indexOf('再见')!=   -1)警报('再见');
否则if(mystring.indexOf(' johnny')!=   -1)警报(' johnny');
否则提醒('默认');

答案 6 :(得分:-2)

开关应该是mystring,例如:

http://www.w3schools.com/js/js_switch.asp