Вызов "Калькулятор" не работает

var calculate = function (firstNumber, secondNumber, operator) {
  if (operator === '+') {
    return parseInt(firstNumber, 10) + parseInt(secondNumber, 10); 
    } else if (operator === '-') {
      return parseInt(firstNumber, 10) - parseInt(secondNumber, 10);
      } else if (operator === '*') {
        return parseInt(firstNumber, 10) * parseInt(secondNumber, 10);
        } else if (operator === '/') {
        return parseInt(firstNumber, 10) / parseInt(secondNumber, 10);
        }
  }

Вариант решения, предполагающий, что вы, как и я, обучаетесь с нуля в рамках интерактивных курсов html academy и двигаетесь последовательно, начиная с блоков начального уровня:

2 лайка

Тогда добро пожаловать: кодгайд Академии.

var calculate = function (firstNumber, secondNumber, operator) {
var result = 0;
firstNumber = parseInt(firstNumber, 10);
secondNumber = parseInt(secondNumber, 10);

if (operator === ‘+’) {
result = firstNumber + secondNumber;
} else if (operator === ‘-’) {
result = firstNumber - secondNumber;
} else if (operator === ‘*’) {
result = firstNumber * secondNumber;
} else if (operator === ‘/’) {
result = firstNumber / secondNumber;
}
return result;
}

нет break

var calculate = function (firstNumber, secondNumber, operator) {
switch (operator) {
case ‘+’:
return +firstNumber + +secondNumber;
break;
case ‘-’:
return +firstNumber - +secondNumber;
break;
case ‘*’:
return +firstNumber * +secondNumber;
break;
case ‘/’:
return +firstNumber / +secondNumber;
default:
return "Sorry, we are out of " + operator + “.”;
}
}

Вопрос Лере. Я вижу тут, как и во всех других испытаниях, полно умников, которые предлагают “лаконичные” решения, используя знания, полученные в других источниках. В связи с этим вопрос: правильно ли при решении пользоваться ТОЛЬКО полученными здесь знаниями или гуглить допустимо (а может даже правильно и рекомендовано вами), потому как неоднократно слышал, что для программиста главный навык - искать инфу в сети, т.к. большинство задач уже решены другими.

1 лайк

Мое решение.

let calculate = function (firstNumber, secondNumber, operator) {
let result = eval(firstNumber + operator + secondNumber);
return result;
}

Моё решение. Коротко и ясно:

let calculate = function (firstNumber, secondNumber, operator) {
  return eval(firstNumber + operator + secondNumber);
}

И второй вариант:

let calculate = function (firstNumber, secondNumber, operator) {
  switch(operator) {
    case "+": {
      return Number(firstNumber) + Number(secondNumber);
      break;
    }
    case "-": {
      return Number(firstNumber) - Number(secondNumber);
      break;
    }
    case "*": {
      return Number(firstNumber) * Number(secondNumber);
      break;
    }
    case "/": {
      return Number(firstNumber) / Number(secondNumber);
      break;
    }
    default: {
      break;
    }
  }
}

Лучше использовать коллекции:

Сводка
const calculate = function(firstNumber, secondNumber, operator) {
  const first = Number(firstNumber);
  const second = Number(secondNumber);
  const operations = {
      '+': first + second,
      '-': first - second,
      '*': first * second,
      '/': second > 0
             ? first / second
              : 'Ошибка при делении на 0, проверьте делитель'
  }

  return operations[operator];
}

function calculate (firstNumber, secondNumber, operator) {
switch (operator) {
case “+”: return Number(firstNumber) + Number(secondNumber);
break;
case “-”: return firstNumber - secondNumber;
break;
case “*”: return firstNumber * secondNumber;
break;
case “/”: return firstNumber / secondNumber;
break;
}
}

let calculate = function(firstNumber, secondNumber, operator) {
  a = +firstNumber;
  b = +secondNumber;
  
    if (operator == '+') { return a + b; } 
    if (operator == '-') { return a - b; }
    if (operator == '*') { return a * b; } 
    if (operator == '/') { return a / b; }
};

(Eval: выполнение строки кода)

let calculate = (firstNumber, secondNumber, operator) =>
    window.eval(firstNumber + operator + secondNumber)

(Конструкция "switch")

let calculate = (firstNumber, secondNumber, operator) => {
  
  switch(operator) {
    case '+':
      return +firstNumber + +secondNumber
    case '-':
      return +firstNumber - +secondNumber
    case '*':
      return +firstNumber * +secondNumber
    case '/':
      return +firstNumber / +secondNumber
  }
}

Используя switch, у меня появился вопрос. Подскажите, если используем switch внутри
функции, достаточно написать return для выхода из функции, или в switch и здесь необходим
break для корректной работы? Задание выполнено без ошибок, но вопрос у меня остался.

1 лайк

Сам покопался, разобрался. Итого:

(eval) Нельзя использовать eval с пользовательским вводом без предварительной валидации. Могут вместо числа или оператора передать код для доступа к cookie/сессии и прочие гадости.
Если добавлять валидацию, код будет ещё больше чем в switch.

(break) return завершает выполнение функции, поэтому нет смысла break использовать внутри данного варианта реализации switch

function calculate(firstNumber, secondNumber, operator){
firstNumber = +firstNumber;
secondNumber = +secondNumber;

switch (operator) {
case ‘+’ : return firstNumber += secondNumber;
case ‘-’ : return firstNumber -= secondNumber;
case ‘*’ : return firstNumber *= secondNumber;
case ‘/’ : return firstNumber /= secondNumber;
}

};