34
$(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);
}

我在控制台中有此代码,它返回 2xdefaults。为什么?

我尝试将每种类型的输入作为文本或密码返回,但我的开关无法识别“typ”

4

4 回答 4

35

您看到这种行为的原因是this调用each中是一个String对象实例,而不是字符串原语。JavaScript 两者都有。在switch语句中,与 case 的比较是 via ===,而字符串实例不是===字符串原语

修复它的三种方法:

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

    switch (String(this)) {
    

    ...这将把它变成一个原始的,然后你的switch作品。

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

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


旁注:您因未声明变量而成为隐式全局恐怖的牺牲品。typ

于 2013-02-16T13:25:16.613 回答
9

jQuery 在这里是矫枉过正,无论如何用 jQuery 正确的方法来看看 TJ 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;
    }
}
于 2013-02-16T13:23:35.867 回答
6

$.each错误地使用了该功能。它应该如下所示:

$.each( typ, function( key, value ) {
    switch(value){

       case "text":
            console.log('text');break;
       default:
            console.log('default');break;
    }
});
于 2013-02-16T13:25:38.627 回答
1

尝试使用switch(String(this))而不是switch(this). 当然,初始化你的变量。

于 2013-02-16T13:26:17.383 回答