2010-12-15 69 views
4

我确信这个问题肯定有一个非常简单的答案,但冒着听起来很愚蠢的风险 - 我无法让这个开关语句正常工作。输入变量'status'可以是'public'或'draft',我可以向你保证它只保存这两个值中的一个,因为我已经在各个阶段提醒它了,无论如何,这里的if语句有效。看看:Javascript switch语句 - 很简单,我做错了什么?

 function switch_status(status){ 
      if (status == 'public'){ 
       return false; 
      } if (status == 'draft') { 
       return true; 
      } 

^这个工作,但用下面的'switch'语句替换'if'不起作用。

  switch(status){ 
      case 'public': 
       return false; 
      case 'draft': 
       return true; 
      } 
     } 

第一个给我提供了不可避免的尴尬简单的答案赢得了我的荣誉!

编辑:这是我的全部代码 -

 $('.status').live('click', 
       function(){ 
        fullClass = $(this).attr('class'); 
        id = fullClass.split(' ').slice(-1); 
        status = fullClass.split(' ').slice(-2,-1); 
        var newStatus = switch_status(status); 
        alert(newStatus); 
      }); 

     function switch_status(status){ 
//    if (status == 'public'){ 
//     return false; 
//    } if (status == 'draft') { 
//     return true; 
//    } 

      switch(status){ 
       case 'public': 
        return false; 
       case 'draft': 
        return true; 
      } 
     } 
+1

使用'switch'时报错吗?一些上下文代码也可能有帮助 - 没有任何发布会显示问题。 – 2010-12-15 16:13:12

+0

尝试添加最后一种情况后的默认代码块 - 默认值:返回false – lnrbob 2010-12-15 16:18:17

+0

@ g.d.d.c我刚刚附加了完整代码的问题。警报显示'undefined',但是当用'if'代替'switch'时,我得到正确的返回值...(!??) – Inigo 2010-12-15 16:19:13

回答

4

你传递status作为一个字符串(的slice结果)的阵列,而不是只是一个字符串。

当您检查数组和字符串之间的相等性时,看起来强制导致相等性检查工作。但是,转换声明中不会发生强制。

如果我改变

status = fullClass.split(' ').slice(-2,-1); 

status = fullClass.split(' ').slice(-2,-1)[0]; 

然后正常工作。

+0

这将是那里的关键。接得好。 – 2010-12-15 16:26:11

+0

@ JacobM哈哈哈,你是舞者!谢谢!所以,如果我不偏离这个问题的范围,你会如何将它转换为字符串? (只是把它包起来)谢谢。 – Inigo 2010-12-15 16:35:00

+0

编辑添加修复程序。 – 2010-12-15 16:35:55

1

我怀疑由于类型转换发生此问题。

Javascipt通常是一种松散类型的语言。您之前使用的if语句使用宽松的==比较。这工作得很好。

但是,switch语句是另一回事。为了匹配,数据类型必须匹配。换句话说,在将status传递给switch语句之前,必须将其转换为字符串。

0

我在jQuery循环中使用了一个.each,并将值与'this'进行了比较;如果我使用console.log,我可以清楚地看到'this'具有正确的值。它在if/else逻辑中工作,但在switch/case逻辑中失败。

的解决方案是:

VAR OBJ = this.toString();

switch(obj){ 
    case 'one': ... 
    case 'two': ... 
} 

通过强制“这个”字符串类型,在开关逻辑现在的作品。