2013-02-16 48 views
5
$(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。为什么?开关案例作为字符串

我尝试返回每种类型的文本或密码输入,但我的交换机不承认“典型”

+0

使用'var'进行变量初始化! – 2013-02-16 13:21:40

回答

8

你看到这种现象的原因是,each调用中thisString对象实例,而不是字符串原始。 JavaScript有两个。在switch声明中,与案例的比较是通过===,并且字符串实例不是===到字符串原语

三种方式来解决这个问题:

  1. 如果您改变开关:

    switch (String(this)) { 
    

    ...那会把它放回原始,于是你switch作品。

  2. VisioN在下面的评论所指出的,使用论点$.each通行证(每个字符串  —作为原始  —将作为第二个参数被设置):

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


旁注:你通过不声明你typ变量堕入The Horror of Implicit Globals

+1

同意VisioN。为什么人们使用jQuery'each()'而不是本地JavaScript循环我永远不会知道! – hohner 2013-02-16 13:28:00

+1

@hohner:是的,我也倾向于简单的循环,迭代函数'$ .each'的签名需要是,um,特殊的。 :-)许多人喜欢使用迭代函数为迭代特定的变量提供了新的范围。这通常表明(对我而言)循环的功能已经太复杂了,需要分手,但这是人们使用它的原因之一。不久之后,他们就可以可靠地使用'forEach'来代替它(这是将条目作为* first *参数的理性事物)。 – 2013-02-16 13:32:07

3

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; 
    } 
} 
+0

虽然TimWolla没有找到正确的问题,但我同意**对**更好。我讨厌人们在这些日子里产生无用代码的方式。 – 2013-02-16 13:27:41

2

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

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

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

他没有使用它*错误*,但是这个并不是他期望的(尽管它很接近)。 – 2013-02-16 13:34:14

+0

对不起,在查阅文档后,你说的完全正确。 – 2013-02-16 13:35:39

0

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