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

Che*_*pot 4 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');           
}  
Run Code Online (Sandbox Code Playgroud)

它总是警告"默认",但你可以看到我希望它提醒"约翰尼"

Ray*_*nos 8

免责声明:此转换是邪恶的.使用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');           
}  
Run Code Online (Sandbox Code Playgroud)

应该按照你的意愿工作.

.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");
Run Code Online (Sandbox Code Playgroud)


Mat*_*all 5

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

switch(!-1)
{
    // stuff
}
Run Code Online (Sandbox Code Playgroud)

相当于

switch(false)
{
    // stuff
}
Run Code Online (Sandbox Code Playgroud)

由于没有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');
Run Code Online (Sandbox Code Playgroud)

或者,减少重复性,

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

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

word = word || 'default';
alert(word);
Run Code Online (Sandbox Code Playgroud)

  • @ChesterCopperpot用HTML创建一个新的DOMFragment.`var fragment = document.createDocumentFragment(); fragment.innerHTML = html;` (2认同)