字符串作为 switch case

38
$(document).ready(function(){
    createForm("text,password",".content");
});

function createForm(types,object){
    typ = types.split(',');
    
    //var source = "";
    
    $.each(typ,function(){
        switch(this) {
            case "text":
                console.log('text');
                break;
            default:
                console.log('default');
                break;
        }
    });
    //$(object).html(source);
}

我有这段代码,在控制台中它返回2个默认值。为什么?

我试图为每种类型返回文本或密码输入,但我的switch无法识别"typ"。


1
使用 var 进行变量初始化! - Tomáš Zato
4个回答

38
您看到这种行为的原因是在each调用内部,this是一个String对象实例,而不是一个字符串基元。JavaScript同时拥有两种。在switch语句中,与案例的比较是通过===进行的,而字符串实例不等于字符串基元

修复它的三种方法:

  1. 如果您将开关更改为:

    switch (String(this)) {
    

    ...那将它转换回原始状态,此时您的switch语句将起作用。

  2. 正如VisioN在下面的评论中指出的那样,请使用$.each传递的参数(每个字符串都将作为原始值作为第二个参数提供):

  3. $.each(typ, function(index, value) {
        switch (value) {
            // ...
        }
    });
    
  4. 使用这个答案中讨论的任何替代方法之一(其中一个是很好的简单for循环)。


附注:您没有声明typ变量,这会引发隐式全局变量的恐怖


1
同意VisioN的观点。为什么人们使用jQuery的each()而不是本地JavaScript循环,我永远不会知道! - hohner
1
@hohner:是的,我也倾向于使用简单的循环,而且$.each迭代函数所需的签名有点特殊。:-) 很多人喜欢使用迭代函数是因为它们可以为迭代特定变量提供新的作用域。这通常表明(对我来说)循环所在的函数已经太复杂了,需要拆分,但这也是人们使用它的原因之一。不久之后,他们将能够可靠地使用forEach(它会以条目作为第一个参数)来代替。 - T.J. Crowder

9

在这里使用jQuery有点过度,无论如何,如果您想了解如何使用jQuery正确地进行操作,请查看T.J. Crowders的答案。

我建议使用标准的for循环方法,这样更简单。它可以正常工作:

var types = "text,password".split(",");
for (var i = 0; i < types.length; i++) {
    switch(types[i]){
        case "text":
            console.log('text');
        break;
        default: 
            console.log('default');
        break;
    }
}

尽管TimWolla没有找到正确的问题,但我同意“for”循环更适合这个目的。我讨厌人们现在编写无效代码的方式。 - Tomáš Zato

6
您错误地使用了$.each函数。正确的用法应该是这样的:
$.each( typ, function( key, value ) {
    switch(value){

       case "text":
            console.log('text');break;
       default:
            console.log('default');break;
    }
});

1
他并没有使用它“错误”,但是this并没有像他预期的那样(虽然很接近)。 - T.J. Crowder
1
抱歉,我查看了文档后发现你说的完全正确。 - Tomáš Zato

1
尝试使用switch(String(this))代替switch(this)。当然,要初始化你的变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接