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

时间:2010-12-15 16:09:24

标签: javascript switch-statement

我确信必须有一个非常简单的答案,但冒着听起来很愚蠢的风险 - 我无法让这个开关语句起作用。输入var,'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;
            }
        }

3 个答案:

答案 0 :(得分:4)

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

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

如果我改变

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

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

然后它运作正常。

答案 1 :(得分:1)

我怀疑由于类型转换而出现此问题。

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

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

答案 2 :(得分:0)

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

解决方案是:

var obj = this.toString();

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

通过将'this'强制为字符串类型,交换机中的逻辑现在可以正常工作。