JavaScript switch语句

10
我在编写一些 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;
}

ResultType是一个0-2的整数值,我可以在FireBug中看到。在所有情况下,switch语句将控制转移至最终的break语句,这意味着所有逻辑完全被跳过了。我错过了什么?

7个回答

19

我相信在Actionscript中,开关使用 === 进行比较。由于JS和AS都遵循ECMAScript标准,我猜测JS也是如此。我的猜测是实际值并不是数字,而可能是字符串。

您可以尝试在开关中使用parseInt(msg.ResultType)或在case语句中使用字符串。


8
一定要指定parseInt的第二个参数!这是基数,所以你可能希望使用:parseInt(msg.ResultType, 10); 如果你不提供它,它会尝试猜测基数,会发生可怕的事情。 - rmeador
好的,只有当你传递类似于077这样的内容时才会发生可怕的事情,这将被解释为八进制(但不是078,例如),或者0x10,但在第二种情况下,很明显你有16进制。无论如何,显式添加基数不会有害,因此这也不是一个坏主意。 - Juan Pablo Califano
在这种情况下,基数并不是必需的,尽管我仅出于清晰和完整性而使用了它。我不认为简洁的代码就是最好的代码。传入的值在服务器端以枚举形式定义,因此永远不会以非标准格式出现。 - Joe Brinkman
2
078 也将被解释为八进制数:parseInt("078") 返回 7。parseInt("08") 返回 0。这些可能是难以发现的 bug 的源头。 - rmeador
抱歉有误导,我只在AS中测试过,其中parseInt的实现方式似乎与JS略有不同(因此parseInt(“078”)返回78)。 - Juan Pablo Califano
使用以下代码将其强制转换为真正的Int32: <code> msg.ResultType | 0 </code> - user182669

2

试试这个:

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;
}
< p > -0 会强制(转换)将您的值视为整数而不更改该值,它比 parseInt 更短。


这是其中一种巧妙的答案,但不如使用parseInt函数来得解释性强。 - Aaron Palmer
而且,Javascript 可能只是在幕后调用 parseInt,所以我们要做的就是节省一点打字时间。 - James Curran
尝试过这个,但它没有起作用。我最终仍然遇到了原来的问题。使用 parseInt(带或不带基数)可以可靠地解决问题。 - Joe Brinkman

2

我遇到了类似的问题,问题原因是虽然它显示为整数值,但switch语句将其读取为字符串变量。也许这里不是这种情况,但这就是发生在我身上的事情。


0

在ES5中可能是最强大的强制转换为整数的方法是:

     msg.ResultType | 0  

这是asm.js的基石之一。这导致非常优化的ES5,并且通过存在编译时使用:

    "use asm"   

指令(在FF和Chromium中)。这种强制转换导致ES5中表示“int”的数字使用Int32类型。因此,原始问题的烹饪食谱解决方案是:

 "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";
  });

0

你确定ResultType是整数(例如0),而不是字符串(例如“0”)吗?

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


根据FireBug的显示,它确实是一个整数。虽然它不是绝对可靠的来源,但是它是一个相当不错的指示器。 - Joe Brinkman

0

看起来将其更改为parseInt(msg.ResultType)已经强制JavaScript引擎正确将其视为整数。感谢您的帮助。


0

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

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


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