Подтвердить что ты не робот

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

4b9b3361

Ответ 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";
  });