代码之家  ›  专栏  ›  技术社区  ›  Joe Brinkman

javascript switch语句

  •  10
  • Joe Brinkman  · 技术社区  · 16 年前

    我在一些javascript中遇到了问题,我在其中编写的switch语句似乎无法按预期工作。

    switch (msg.ResultType) {
      case 0:
        $('#txtConsole').val("Some Val 0");
        break;
      case 1:
        $('#txtConsole').val("Some Val 1");
        break;
      case 2:
        $('#txtConsole').text("Some Val 2");
        break;
    }
    

    结果类型是一个整数值0-2,我可以在Firebug中看到它。在所有情况下,开关将控制权转移到最终中断语句,这意味着完全跳过了所有逻辑。我错过了什么?

    7 回复  |  直到 11 年前
        1
  •  19
  •   Juan Pablo Califano    16 年前

    我确信一个开关在actionscript中使用==进行比较,因为JS和两者都遵循ECMAScript标准,所以我猜JS也是如此。我猜这个值实际上不是一个数字,而是一个字符串。

    您可以尝试在开关中使用parseint(msg.resultType),或者在案例中使用字符串。

        2
  •  2
  •   Jeremy Reagan    16 年前

    我遇到了一个类似的问题,问题是,当它显示为int值时,switch语句将它作为字符串变量读取。这里可能不是这样,但我就是这样。

        3
  •  2
  •   Joel Coehoorn    16 年前

    试试这个:

    switch (msg.ResultType-0) {
      case 0:
        $('#txtConsole').val("Some Val 0");
      break;
      case 1:
        $('#txtConsole').val("Some Val 1");
      break;
      case 2:
        $('#txtConsole').text("Some Val 2");
      break;
    }
    

    这个 -0 将强制(强制)它在不更改值的情况下将您的值视为整数,并且它比parseint短得多。

        4
  •  0
  •   Gareth    16 年前

    您确定resultType是整数(例如0)而不是字符串(例如“0”)吗?

    这很容易解释行为上的差异。

        5
  •  0
  •   Joe Brinkman    16 年前

    将其更改为parseInt(msg.resultType)似乎已迫使javascript引擎将其正确地视为整数。谢谢你的帮助。

        6
  •  0
  •   17 of 26    16 年前

    我注意到的第一件事是,在这三种情况中,有两种情况下调用.val(),第三种情况下调用.text()。

    如果您试图将case语句更改为字符串而不是int,那么我唯一能想到的是,您在该行的某个地方遇到了异常,这可能是由于访问未定义的变量引起的。

        7
  •  0
  •   user182669    11 年前

    ES5中对int的最强大的强制可能是:

         msg.ResultType | 0  
    

    这是ASM.JS驻留的基石之一。这导致 非常 经过优化的ES5,并在以下情况下进行编译:

        "use asm"   
    

    指令(FF和铬)。这种强制导致Int32类型被用于ES5中确实表示“int”的数字。所以5年前的原始问题的烹饪书配方解决方案是:

     "use strict" ;
    $("#txtConsole").val(
      switch (msg.ResultType | 0) {
         case 0:
              "Some Val 0";
         break;
        case 1:
             "Some Val 1";
        break;
        case 2:
             "Some Val 2";
        break;
        default :
             "Illegal ResultType";
      });