我"想"使用开关,但是当我以这种方式使用它时,我似乎无法使它工作.谁知道为什么?
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)
它总是警告"默认",但你可以看到我希望它提醒"约翰尼"
免责声明:此转换是邪恶的.使用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)
应该按照你的意愿工作.
我很想进一步重构它.
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)
!-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)