Что не так с моим оператором switch здесь?

#javascript

#javascript

Вопрос:

Попытка вывести, как введенное пользователем число сравнивается с числом 117, очень простая, но я почему-то делаю что-то не так?

 let output = "";
//
//input Number here
let userNumber = 117;

function calcUserNumberFunc(indvNumber) {
    switch (indvNumber) {
        case userNumber === 117:
            return `the number ${userNumber} is equal to 117.`;
        case userNumber > 117:
            return `the number ${userNumber} is greater than 117.`;
        case userNumber < 117:
            return `the number ${userNumber} is less than 117.`;
        default:
            return `Invalid, or not whole number.`;
    }
}
output  = calcUserNumberFunc();
document.getElementById("app").innerHTML = output;
  

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

1. calcUserNumberFunc принимает параметр, который вы затем тестируете, но вы не передаете ему никаких параметров. Вам также нужно иметь case те , с которыми вам нужно сравнивать , например case 117 — лучше switch полностью отказаться от них и использовать if вместо них

2. Вы не должны использовать операторы switch, используйте if

3. Вы можете заставить switch работать с switch (true) { , но это не лучшая практика.

Ответ №1:

Хотя ваш код синтаксически корректен (т. Е. не выдает никаких ошибок), вы используете не [switch][1] так, как это задумано.

switch (expression) { ... } вычисляет expression и сопоставляет его значения со значением, которое вы указываете в случаях. В вашем коде вы ничего не делаете с этим параметром.

Что на самом деле происходит, так это то, что вы сравниваете indvNumber с результатами ваших сравнений (например, userNumber === 117), и поскольку все они являются bools ( true или false ), вы в основном сравниваете indvNumber с true или false.

Тем не менее. Для вашего варианта использования вы на самом деле используете [IFs][2] инструкции для сравнения всех ваших случаев.

Кроме того, когда вы вызываете функцию, calcUserNumberFunc() вы не передаете никаких параметров, поэтому значение indvNumber не определено, что равно false (как и [falsy value][3]), поэтому в вашем коде вы всегда будете получать the number ${userNumber} is greater than 117. ;. userNumber > 117 имеет значение false и сравнивается с indvNumber , которое не определено.

[3]https://developer.mozilla.org/en-US/docs/Glossary/Falsy

Ответ №2:

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

 //input Number here
let inputNumber = 117

// Assuming userNumber is the input Number and indvNumber is the number to be compare
function calcUserNumberFunc(userNumber, indvNumber = 117) {
  if (userNumber === indvNumber) {
      return `the number ${userNumber} is equal to ${indvNumber}.`;
  }
  if (userNumber > indvNumber) {
      return `the number ${userNumber} is greater than ${indvNumber}.`;
  }
  if (userNumber < indvNumber) {
      return `the number ${userNumber} is less than ${indvNumber}.`;
  }
  return `Invalid, or not whole number.`;
}

document.getElementById("app").innerHTML = calcUserNumberFun(inputNumber);
  

Теперь вы можете передавать номер ввода напрямую в качестве параметра userNumber
Например: calcUserNumberFunc(116) и он вернется the number 116 is less than 117. .

Вы также можете перезаписать 117 на другое число, если вам когда-нибудь понадобится его изменить, например, сравнивая пользовательский ввод с 120 вместо этого.
Например: calcUserNumberFunc(120, 120) . Это должно вернуть the number 120 is equal to 120.