如何使用-javascript开关盒函数中的1

如何使用-javascript开关盒函数中的1,javascript,Javascript,我“想要”使用这个开关,但当我以这种方式使用它时,我似乎无法让它工作。有人知道为什么吗 var mystring='my name is johnny'; switch (!-1) { case mystring.indexOf('hello'): alert('hello'); break; case mystring.indexOf('goodbye'): alert('goodbye');

我“想要”使用这个开关,但当我以这种方式使用它时,我似乎无法让它工作。有人知道为什么吗

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');           
}  

它总是提醒“default”,但您可以看到,我希望它提醒“johnny”

这里发生的事情是,您正在切换
以查看
的结果-1
且未找到该
案例
<代码>开关盒
似乎不是此处使用的正确构造。

开关应为mystring,例如:


-1将
-1
强制为布尔值,然后对其求反,因此

switch(!-1)
{
    // stuff
}
相当于

switch(false)
{
    // stuff
}
由于没有
case false
,因此将始终执行
默认值
。这不是使用开关的正确方法-在常量表达式上使用开关是没有意义的

您为什么“想要”使用
开关


以下是如何正确实施它:

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);

表达式
-1
将计算为
false

您正在尝试转换比较,如
x!=-1进入
x==-1
,但是
运算符不会否定比较,只否定值。

您的“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
(这两个值是
=
,但不是
==
),但我个人认为JavaScripts
索引(…)=-1
更糟糕。(为什么不能是
false
null
?)

免责声明:此开关是邪恶的。使用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');           
}  
应该按你想要的那样工作

我很想进一步重构它

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");

我认为你的实施是不正确的。如果。。。else

var mystring='我的名字叫约翰尼'

if(mystring.indexOf('hello')!=-1) 警惕(“你好”);
else if(mystring.indexOf('拜拜')= -1) 警惕(“再见”)<否则如果(mystring.indexOf('johnny')= -1) 警惕(“约翰尼”)
其他警报(“默认”)


-1供学校参考。学校不是可靠的信息来源。遵循规则。MDN将是@Guffa更好的资源,您可以登录MDC页面,自己编辑/修复错误。对于w3schools页面中的错误,您可以通过电子邮件发送给他们,我怀疑他们是否会修复这些错误(还有很多其他错误他们无法修复)@Raynos:不,是活动页面。@Guffa W3Goods页面有一个列表,其中有来自:“就在上面,有一堆推特账号。在tweet上发送其中一条消息以取得联系。如果您想在“开关”中使用
indexOf
;你能做的最好的事情就是把一堆
if
else if(s)
链接起来,他知道如果找不到它,它会返回-1。所以他试图打开一个返回0或更多的。除了对
-1的求反之外,它返回一个布尔值,因此没有帮助。这里面有一些(反常的)逻辑。最好的解决方案是打开一个实数布尔值,用正则表达式
替换
indexOf
。test
语句。@切斯特,请不要告诉我你在用
indexOf
解析HTML。您应该使用DOM。@ChesterCoperpot使用HTML创建一个新的DOM片段
var fragment=document.createDocumentFragment();fragment.innerHTML=html@Chester,你在用jQuery吗?如果是这样:假设从ajax调用返回的HTML字符串存储在名为
HTML
的变量中(就像在Raynos的注释中一样)。然后
$(html)
返回一个jQuery对象,该对象包含已解析的输入html树。@切斯特:可以,但不完全是这样。尝试
var mydiv=$(html)条件总是计算为一个值(布尔值)PHP是开源的->重写相关的extension@Matt球我知道这条线索…这部分是一个愤世嫉俗的反应,部分是一个悲伤的,因为似乎我将不得不在这些线做些什么。。。(此外,我不是维护人员之一)第一个工作,我将使用那个。非常感谢。第二种方法看起来也有效,但更难阅读。我遇到的问题是阅读我的代码。这是一个非常卑鄙的
switch
语句。使用
if
/
else if
(虽然我知道您只是在演示如何使用
开关
)可以更清楚、更简洁地完成此操作。阅读这篇精彩的文章,避免出现开关盒综合症-