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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
11
0
10 530
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Я столкнулся с аналогичной проблемой, и проблема оказалась в том, что, когда он отображался как значение int, оператор switch считывал его как строковую переменную. Может быть, здесь не так, но со мной случилось именно это.

Вы уверены, что ResultType является целым числом (например, 0), а не строкой (например, «0»)?

Это может легко объяснить разницу в поведении

Согласно FireBug, это определенно было целое число. Не то чтобы это исчерпывающий источник, но довольно хороший индикатор.

Joe Brinkman 30.10.2008 17:09
Ответ принят как подходящий

Я уверен, что переключатель использует === для сравнения в ActionScript, а поскольку JS и AS следуют стандарту ECMAScript, я думаю, то же самое относится и к JS. Я предполагаю, что значение на самом деле не число, а, возможно, строка.

Вы можете попробовать использовать parseInt (msg.ResultType) в переключателе или использовать строки в случаях.

ВСЕГДА указывайте второй параметр для parseInt! Это основание системы счисления, поэтому, вероятно, вам понадобится: parseInt (msg.ResultType, 10); Если вы не укажете его, он попытается угадать систему счисления, и произойдут ужасные вещи.

rmeador 30.10.2008 17:12

Что ж, ужасные вещи произойдут только в том случае, если вы передадите что-то вроде 077, которое будет интерпретировано как восьмеричное (но не 078, например) или 0x10, но во втором случае довольно ясно, что у вас есть база 16. В любом случае, добавив Radix явно не повредит, так что это тоже неплохая идея.

Juan Pablo Califano 30.10.2008 17:25

В этом случае основание системы счисления не требуется, хотя я использовал его только для ясности и полноты. Я не из тех, кто считает, что краткий код - лучший код. Входящие значения определяются в перечислении на стороне сервера и поэтому никогда не будут в каком-либо нестандартном формате.

Joe Brinkman 30.10.2008 17:30

078 также будет интерпретироваться как восьмеричное: parseInt ("078") возвращает 7. parseInt ("08") возвращает 0. Это может быть источником почти невозможных ошибок.

rmeador 30.10.2008 17:31

Извините за заблуждение, я тестировал его только в AS, где parseInt, похоже, реализован несколько иначе, чем в JS (поэтому parseInt ("078") возвращает 78).

Juan Pablo Califano 30.10.2008 17:37

use: <code> msg.ResultType | 0 </code> для приведения к истинному Int32

user182669 19.08.2013 15:07

Похоже, изменение его на 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.

Aaron Palmer 30.10.2008 17:12

И, предположительно, Javascript будет просто вызывать parseInt за кулисами, поэтому все, что мы сохраняем, - это небольшой набор текста.

James Curran 30.10.2008 17:19

Пробовал это, и это не сработало. Я все еще столкнулся с исходной проблемой. ParseInt (с основанием системы счисления и без него) работал надежно.

Joe Brinkman 30.10.2008 17:28

Первое, что я заметил, это то, что в двух из трех случаев вы вызываете .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";
  });

Другие вопросы по теме