【问题标题】:Switch case as string切换大小写为字符串
【发布时间】:2013-02-01 09:01:24
【问题描述】:
$(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”

【问题讨论】:

  • 使用var 进行变量初始化!

标签: javascript


【解决方案1】:

jQuery 在这里是矫枉过正的,无论如何使用 jQuery 的正确方法,看看 T.J.人群回答。

我推荐一种使用标准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;
    }
}

【讨论】:

  • 虽然 TimWolla 没有找到正确的问题,但我同意 for 更适合此目的。我讨厌这些天人们制作不合格代码的方式。
【解决方案2】:

您看到此行为的原因是each 调用中的thisString 对象实例,而不是字符串原语。 JavaScript 两者都有。在switch 语句中,与case 的比较是通过===,而字符串instance 不是=== 到字符串primitive

修复它的三种方法:

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

    switch (String(this)) {
    

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

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

    $.each(typ, function(index, value) {
        switch (value) {
            // ...
        }
    });
    
  3. 使用the alternatives discussed in this other answer 中的任何一个(其中一个是一个非常简单的for 循环)。


旁注:由于未声明您的 typ 变量,您将成为 The Horror of Implicit Globals 的牺牲品。

【讨论】:

  • 同意 VisioN。为什么人们使用 jQuery each() 而不是原生 JavaScript 循环我永远不会知道!
  • @hohner:是的,我也倾向于简单的循环,迭代函数$.each 需要的签名是,嗯,特别的。 :-) 很多人喜欢这样一个事实,即使用迭代函数为他们提供了迭代特定变量的新范围。这通常表明(对我而言)循环所在的函数已经太复杂并且需要分解,但这是人们使用它的原因之一。不久之后,他们将能够可靠地使用 forEach 来代替(这样做是合理的,将条目作为 first 参数)。
【解决方案3】:

您错误地使用了$.each 函数。它应该是这样的:

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

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

【讨论】:

  • 他没有使用它错误,但this 并没有达到他的预期(尽管它很接近)。
  • 很抱歉,在我查阅文档后,您所说的完全正确。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2018-09-07
    • 1970-01-01
    • 2020-07-19
    • 2015-11-21
    相关资源
    最近更新 更多