我在编写的一些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中看到它。在所有情况下,交换机将控制权转移到最终的中断语句,这意味着完全跳过所有逻辑。我错过了什么?
答案 0 :(得分:19)
我确信一个开关在Actionscript中使用===进行比较,因为JS和AS都遵循ECMAScript标准,我想这同样适用于JS。我的猜测是该值实际上不是一个数字,而是一个字符串。
您可以尝试在交换机中使用parseInt(msg.ResultType)或在案例中使用字符串。
答案 1 :(得分:2)
我遇到了类似的问题,问题结果是,当它显示为int值时,switch语句将其作为字符串变量读取。可能不是这里的情况,但这就是发生在我身上的事。
答案 2 :(得分: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;
}
-0
将强制(强制)它将您的值视为整数而不更改值,并且它比parseInt短得多。
答案 3 :(得分:0)
你确定ResultType是一个整数(例如0)而不是字符串(例如“0”)吗?
这可以很容易地解释行为上的差异
答案 4 :(得分:0)
看起来将其更改为parseInt(msg.ResultType)已迫使JavaScript引擎将其正确地视为整数。谢谢你的帮助。
答案 5 :(得分:0)
我注意到的第一件事是,在三种情况中的两种情况下,你正在调用.val(),而在第三种情况下,你正在调用.text()。
如果您尝试将case语句更改为字符串而不是int,那么我唯一能想到的就是您可能会因访问未定义变量而在某个地方遇到异常。
答案 6 :(得分:0)
对于ES5中可用的最强大的强制可能是:
msg.ResultType | 0
这是asm.js所在的基石之一。这导致非常优化的ES5,并通过编译出现来使用:
"use asm"
指令(在FF和Chromium中)。这种强制导致Int32类型用于ES5中代表“int”的Numbers。因此,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";
});