将案例切换为字符串

kra*_*aYz 23 javascript

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

我在控制台中有这个代码它返回2xdefaults.为什么?

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

T.J*_*der 23

你看到这种行为的原因是thiseach调用中是一个String对象实例,而不是一个字符串原语.JavaScript都有.在一个switch语句中,与案例的比较是通过===,而字符串实例不是===字符串基元.

解决它的三种方法:

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

    switch (String(this)) {
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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


旁注:你没有宣布你的变量,你就成了隐形全球恐怖的牺牲品typ.


Tim*_*lla 6

jQuery在这里有点矫枉过正,对于使用jQuery做正确的方法,无论如何都要看看TJ Crowders的答案.

我建议使用标准的for-loop 方法更简单.它工作正常:

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


Tom*_*ica 5

$.each错误地使用了该功能。它应该是这样的:

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

       case "text":
            console.log('text');break;
       default:
            console.log('default');break;
    }
});
Run Code Online (Sandbox Code Playgroud)