Оператор Switch по умолчанию всегда показывает значение по умолчанию

У меня есть оператор switch. Он почти работает нормально, однако вместо того, чтобы просто показывать один случай, он показывает выбранный случай, а затем значение по умолчанию. Вот мой код:

var people = {
  names: ["Sam", "Tim", "Steve"],
  emails: ["[email protected]", "[email protected]", "[email protected]"],
  phonenums: [1111, 2222, 4545]
}

var search = prompt("Type in someone's name to find their phone number and email.");

switch (search) {
  case people.names[0]:
    alert(people.names[0] + "'s email: " + people.emails[0] + " phone number: " + people.phonenums[0]);
  case people.names[1]:
    alert(people.names[1] + "'s email: " + people.emails[1] + " phone number: " + people.phonenums[1]);
  case people.names[2]:
    alert(people.names[2] + "'s email: " + people.emails[2] + " phone number: " + people.phonenums[2]);
  default:
    alert("I don't know that person.");
}

Почему это происходит?

Код также доступен здесь: jsfiddle.net/theratcoder/bkvt85me/39

theratkeeper 30.05.2019 18:03

Возможный дубликат Странное поведение переключателя JavaScript

Heretic Monkey 30.05.2019 18:11
Поведение ключевого слова "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) для оценки ваших знаний,...
1
3
74
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Потому что у вас нет break в ваших переключателях.

Проверьте документацию по оператору switch на МДН. О break (акцент мой) сказано следующее.

The optional break statement associated with each case label ensures that the program breaks out of switch once the matched statement is executed and continues execution at the statement following switch. If break is omitted, the program continues execution at the next statement in the switch statement.

Поэтому обновите свои дела, чтобы они выглядели как

case people.names[0]:
  alert(people.names[0] + "'s email: " + people.emails[0] + " phone number: " + people.phonenums[0]);
  break;

Вам необходимо предоставить оператор break

Ответ принят как подходящий

Вам нужно поставить breaks в операторе switch, если вы не хотите, чтобы работало значение по умолчанию. Просто сделайте это:

var people = {
    names : ["Sam", "Tim", "Steve"],
    emails : ["[email protected]", "[email protected]", "[email protected]"],
    phonenums : [1111, 2222, 4545]
}

var search = prompt("Type in someone's name to find their phone number and email.");
switch(search) {
    case people.names[0]:
        alert(people.names[0] + "'s email: " + people.emails[0] + " phone number: " + people.phonenums[0]);
        break;

    case people.names[1]:
        alert(people.names[1] + "'s email: " + people.emails[1] + " phone number: " + people.phonenums[1]);
        break;

    case people.names[2]:
        alert(people.names[2] + "'s email: " + people.emails[2] + " phone number: " + people.phonenums[2]);
        break;

    default:
        alert("I don't know that person.");
}

В вашем конкретном сценарии вам может быть лучше искать индекс правильного человека и использовать его, чтобы ваш массив мог свободно увеличиваться и уменьшаться. Что-то вроде этого может работать:

var search = prompt("Type in someone's name to find their phone number and email.");
boolean found = false;
int i = 0;
while(!found && i<people.names.length) {
    if (people.names[0] == search){
        found=true;
    } else {
        i++;
    }
}
if (found){
        alert(people.names[i] + "'s email: " + people.emails[i] + " phone number: " + people.phonenums[i]);
} else {
        alert("I don't know that person.");
}

Мой js ржавый, и я использую свой телефон, я проверю позже на наличие синтаксических ошибок, если никто не заметит их.

Ну это было глупо. У меня было ощущение, что я что-то забыл. Спасибо.

theratkeeper 30.05.2019 22:02

Легко делается. Кстати, еще раз взглянув на свой код, вы, возможно, захотите применить другой подход. Как и сейчас, вам нужно жестко закодировать каждое число, которое может появиться. Если вместо этого вы искали массив (цикл while мог бы работать достаточно просто), а затем использовали индекс, по которому был найден человек, тогда ваш массив мог бы свободно увеличиваться или уменьшаться.

CasualViking 30.05.2019 22:07

Собственно, именно это я и собирался сделать дальше :)

theratkeeper 30.05.2019 22:11

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

CasualViking 30.05.2019 22:15

Спасибо за это. Я, скорее всего, буду использовать его.

theratkeeper 30.05.2019 22:38

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