У меня есть проблема с некоторыми кодами 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. Во всех случаях переключатель передает управление последнему оператору break, что означает, что вся логика полностью пропускается. Что мне не хватает?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я столкнулся с аналогичной проблемой, и проблема оказалась в том, что, когда он отображался как значение int, оператор switch считывал его как строковую переменную. Может быть, здесь не так, но со мной случилось именно это.
Вы уверены, что ResultType является целым числом (например, 0), а не строкой (например, «0»)?
Это может легко объяснить разницу в поведении
Я уверен, что переключатель использует === для сравнения в ActionScript, а поскольку JS и AS следуют стандарту ECMAScript, я думаю, то же самое относится и к JS. Я предполагаю, что значение на самом деле не число, а, возможно, строка.
Вы можете попробовать использовать parseInt (msg.ResultType) в переключателе или использовать строки в случаях.
ВСЕГДА указывайте второй параметр для parseInt! Это основание системы счисления, поэтому, вероятно, вам понадобится: parseInt (msg.ResultType, 10); Если вы не укажете его, он попытается угадать систему счисления, и произойдут ужасные вещи.
Что ж, ужасные вещи произойдут только в том случае, если вы передадите что-то вроде 077, которое будет интерпретировано как восьмеричное (но не 078, например) или 0x10, но во втором случае довольно ясно, что у вас есть база 16. В любом случае, добавив Radix явно не повредит, так что это тоже неплохая идея.
В этом случае основание системы счисления не требуется, хотя я использовал его только для ясности и полноты. Я не из тех, кто считает, что краткий код - лучший код. Входящие значения определяются в перечислении на стороне сервера и поэтому никогда не будут в каком-либо нестандартном формате.
078 также будет интерпретироваться как восьмеричное: parseInt ("078") возвращает 7. parseInt ("08") возвращает 0. Это может быть источником почти невозможных ошибок.
Извините за заблуждение, я тестировал его только в AS, где parseInt, похоже, реализован несколько иначе, чем в JS (поэтому parseInt ("078") возвращает 78).
use: <code> msg.ResultType | 0 </code> для приведения к истинному Int32
Похоже, изменение его на parseInt (msg.ResultType) заставило движок JavaScript правильно рассматривать его как целое число. Спасибо за помощь.
Попробуй это:
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.
Это один из тех ответов, который является приятным, но не таким пояснительным, как использование parseInt.
И, предположительно, Javascript будет просто вызывать parseInt за кулисами, поэтому все, что мы сохраняем, - это небольшой набор текста.
Пробовал это, и это не сработало. Я все еще столкнулся с исходной проблемой. ParseInt (с основанием системы счисления и без него) работал надежно.
Первое, что я заметил, это то, что в двух из трех случаев вы вызываете .val (), а в третьем - .text ().
Если вы попытались изменить операторы case на строки вместо int, то единственное, что я могу придумать, это то, что вы попали в исключение где-то в строке, возможно, вызванное доступом к неопределенной переменной.
Вероятно, самое мощное приведение к int, доступное в ES5:
msg.ResultType | 0
Это один из краеугольных камней, на котором находится asm.js. Это приводит к оптимизированному для очень ES5 и используется при компиляции при наличии:
"use asm"
директива (в FF и Chromium). Это приведение приводит к тому, что для чисел в ES5 используется тип Int32, который действительно представляет собой «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";
});
Согласно FireBug, это определенно было целое число. Не то чтобы это исчерпывающий источник, но довольно хороший индикатор.