Оператор переключения JavaScript
У меня проблема в некотором 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. Во всех случаях коммутатор передает управление команде окончательного разрыва, что означает, что вся логика полностью пропущена. Что мне не хватает?
Ответы
Ответ 1
Я уверен, что коммутатор использует === для сравнения в ActionScript, и поскольку JS и AS оба соответствуют стандарту ECMAScript, я думаю, что то же самое относится к JS. Я предполагаю, что это значение не является числом, а, возможно, строкой.
Вы можете попробовать использовать parseInt (msg.ResultType) в коммутаторе или использовать строки в случаях.
Ответ 2
У меня возникла аналогичная проблема, и проблема оказалась такой, что, когда она показывалась как значение int, оператор switch читал ее как строковую переменную. Может быть, здесь не так, но вот что случилось со мной.
Ответ 3
Попробуйте следующее:
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
Вы уверены, что ResultType является целым числом (например, 0), а не строкой (например, "0" )?
Это может легко объяснить разницу в поведении
Ответ 5
Похоже, что изменение его на parseInt (msg.ResultType) заставило механизм JavaScript правильно относиться к нему как к целому. Спасибо за помощь.
Ответ 6
Первое, что я заметил, это то, что в двух из трех случаев вы вызываете .val(), а в третьем вы вызываете .text().
Если вы попытались изменить операторы case на строки вместо ints, то единственное, что я могу подумать, это то, что вы попадаете в исключение где-то вдоль линии, возможно, вызванной доступом к переменной undefined.
Ответ 7
Вероятно, самым сильным принуждением к int, доступным в ES5, является:
msg.ResultType | 0
Это один из основных камней, на котором находится asm.js. Это приводит к оптимизации очень ES5 и используется путем компиляции на наличие:
"use asm"
(в FF и Chromium). Это принуждение приводит к тому, что тип 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";
});