Switch() не работает с числами Math.random()

#javascript #switch-statement

#javascript #switch-оператор

Вопрос:

Я пытаюсь создать функцию, которая включает switch() и дает мне ответы на конкретные, случайно сгенерированные числа. Каким-то образом моя функция не выполняет случай, который она должна запускать. Это дает мне только регистр по умолчанию, независимо от того, какое число.

Это мой код:

 var i;
var girl;

function response() {
    var girl = prompt("What girl do you like?");
    var r = (Math.random() * (3 - 1   1)   1).toFixed(0);
    var i = r;

    switch(i) {
        case (i == 1):
            alert(girl   " likes you as a friend.");
            break;

        case (i == 2):
            alert(girl   " does not really like you.");
            break;

        case (i == 3):
            alert(girl   " has a crush on you.");
            break;

        case (i == 4):
            alert(girl   " wants you to ask her out.");
            break;

        default:
            console.log(i);
    }
}
  

Комментарии:

1. toFixed преобразуется в строку, поэтому вы можете использовать case '1': , case '2': , и т.д. Кроме того, ваш диапазон не будет охватывать все случаи, которые вы, возможно, захотите использовать var i = (Math.random() * 4 1).toFixed(0); .

Ответ №1:

Это не то, как работает переключатель. Он сравнивает значение для каждого case с switch .

По сути, теперь он сравнивает значение i несколько раз с логическими значениями (например, результат i == 1 ).

Кроме того, ваша случайность не становится более случайной, добавляя арифметику со статическими значениями в значение, как вы это делали. Вы должны заменить его на 4 . Вы также должны использовать что-то вроде Math.ceil() (поскольку вы игнорируете 0 значение, что также, вероятно, не очень хорошая идея), а не toFixed() который возвращает строку.

Вам также не нужны круглые скобки вокруг значений для сравнения. Если вы знаете диапазон случайного числа, вам также, вероятно, не нужен регистр по умолчанию (поскольку вы уже охватили все возможности).

Вы также можете использовать r напрямую, не нужно переназначать его.

Ваши переменные также являются локальными для вашей функции, поэтому, вероятно, они не нужны наверху.

Вот как я бы переписал это:

 function response() {
    var girl = prompt("What girl do you like?");
    var r = Math.floor(Math.random() * 4);

    switch(r) {
        case 0:
            alert(girl   " likes you as a friend.");
            break;

        case 1:
            alert(girl   " does not really like you.");
            break;

        case 2:
            alert(girl   " has a crush on you.");
            break;

        case 3:
            alert(girl   " wants you to ask her out.");
            break;

    }
}
  

…или даже…

 function response() {
    var answerSuffixes = [
        " likes you as a friend.",
        " does not really like you.",
        " has a crush on you.",
        " wants you to ask her out."
    ];
    var girl = prompt("What girl do you like?");
    var r = Math.floor(Math.random() * answerSuffixes.length);

    alert(girl   answerSuffixes[r]);
}
  

Комментарии:

1. Но если значение i на самом деле, скажем, 3, разве это не должно быть верно для i == 3? Возможно ли это только с помощью операторов if then? E: Спасибо 🙂

2. Обновление: я попробовал ваш код (но добавил часть от @Nina Scholz). Спасибо! Теперь это работает 🙂

Ответ №2:

Оператор case в Javascript уже выполняет сопоставление с целью i :

 switch(i) {
        case 1:
            alert(girl   " likes you as a friend.");
            break;

        case 2:
            alert(girl   " does not really like you.");
            break;

        case 3:
            alert(girl   " has a crush on you.");
            break;

        case 4:
            alert(girl   " wants you to ask her out.");
            break;

        default:
            console.log(i);
    }
  

Таким образом, нет необходимости сравнивать выражения в каждом case .

Ответ №3:

Когда вы объявляете переключатель, используемая переменная сравнивается с каждым случаем, поэтому оценки не нужны.

Также это может помочь разобрать ваш ответ из ‘r’ в целое число, чтобы контролировать типы переменных.

 function response() {
    var girl = prompt("What girl do you like?");
    var r = parseInt((Math.random() * (3 - 1   1)   1).toFixed(0));
    var i = r;

    switch(i) {
        case 1:
            alert(girl   " likes you as a friend.");
            break;

        case 2:
            alert(girl   " does not really like you.");
            break;

        case 3:
            alert(girl   " has a crush on you.");
            break;

        case 4:
            alert(girl   " wants you to ask her out.");
            break;

        default:
            console.log(i);
   }
}
  

Ответ №4:

switch сравнивает строго.

Вам нужно либо

 switch (i) {
    case 1:
        alert(girl   " likes you as a friend.");
        break;
  

Или

 switch (true) {
    case i === 1:
        alert(girl   " likes you as a friend.");
        break;
  

Комментарии:

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

2. @Liam, может быть, но если есть смешанные типы, тогда это пойдет.