JavaScript switch语句-非常简单,我做错了什么?

4

我相信这一定有一个非常简单的答案,但冒着听起来很傻的风险 - 我无法使这个switch语句工作。输入变量'status'可以是'public'或'draft',我可以向您保证它只保持这两个值之一,因为我已经在各个阶段警告过了,而且,这里的if语句也有效。请看:

        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 时是否报错?一些上下文代码可能有所帮助 - 没有发布的内容证明存在问题。 - g.d.d.c
尝试在最后一个case之后添加一个默认的代码块 -- default: return false - Stuart Burrows
@g.d.d.c 我刚刚附加了完整的代码到问题中。警告显示“未定义”,但是当将“switch”替换为“if”时,我得到了正确的返回值...(!?) - Inigo
@g.d.d.c 谢谢,不是全局变量,它只存在于函数中。我已经尝试使用“var ___”声明所有变量,反之亦然。都不起作用。感到困惑。 - Inigo
1
不是要挑剔,但你遇到的问题只是普通的 JavaScript switch 语句,与 jQuery 无关。 - Ken Redler
显示剩余2条评论
3个回答

4

您正在将status作为一个字符串数组(slice的结果)传递,而不是只作为一个字符串传递。

当您检查数组和字符串之间的相等性时,似乎强制转换导致了相等性检查的工作。但在switch语句中不会发生强制转换。

如果我进行更改:

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

为了

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

然后它就可以正常工作了。

@JacobM 哈哈哈,你太棒了!谢谢!那么,如果我没有偏离这个问题的范围太远,你会如何将它转换为字符串?(只是为了结束这个话题)谢谢。 - Inigo
2
作为教人钓鱼的方法,这是我找到答案的方式:Firebug。我使用一个设置在状态上的监视器逐步执行代码,并发现它是一个数组。在处理JavaScript问题时,Firebug应该始终是你首选的工具。 - Jacob Mattison

1

我怀疑这个问题是由于类型转换引起的。

Javascipt通常是一种弱类型语言。你之前使用的if语句使用了宽松的==比较,这很好用。

然而,switch语句就不同了。为了匹配case,数据类型必须匹配。换句话说,在传递给switch语句之前,status必须被转换为字符串。


0
我在jquery循环中使用了.each,并将值与“this”进行比较;如果我使用console.log,我可以清楚地看到“this”具有正确的值。它在if/else逻辑中起作用,但在switch/case逻辑中失败了。
解决方案是:
var obj = this.toString();
switch(obj){
    case 'one': ...
    case 'two': ...
}

通过将“this”强制转换为字符串类型,现在可以使switch中的逻辑正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接