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


#1

Не работает проверка.


#2

Здравствуйте, мы разберёмся. Спасибо за обратную связь)


#3

В курсах начали рассказывать синтаксис es6 или как?)


#4

Пока нет, в ближайших курсах начнём


#6

я не понимаю что написано в коде выше, поэтому покажу свое решение, пока знаний только на это хватает((

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


#7

Выше пример полиморфизма, сама по себе штука очень крутая, позволяет писать код без условных конструкций. Непонятно скорей всего из-за того, что код написан на современном стандарте es6, советую его освоить самостоятельно.
Кстати, в том примере словарь с операторами надо было записать в константу и вынести за пределы функции, он же не изменяется. Ну и функцию лучше так никогда не определять, лучше по старинке или стрелочную, как в словаре


#8

Подскажите, почему не срабатывает проверка на плюсе и на умножении.

var calculate = function(firstNumber, secondNumber, operator) {
  firstNumber = +firstNumber;
  secondNumber = +secondNumber;
  switch (operator) {
    case '+' : firstNumber += secondNumber;
    case '-' : firstNumber -= secondNumber;
    case '*' : firstNumber *= secondNumber;
    case '/' : firstNumber /= secondNumber;
    default : return firstNumber;
  }
  return firstNumber;
};

#9

что это?


#10

потому что не правильно используете switch, почитайте про него подробнее, если не получится исправить - перепешите на if


#11

Так можно привести строку к числу


#12

никогда не стоит изменять параметры функции


#13

Понятно, попробую по-другому. Спасибо!


#14

Получилось. Забыл добавить break;

var calculate = function(firstNumber, secondNumber, operator) {
  var num1 = +firstNumber;
  var num2 = +secondNumber;
  switch (operator) {
    case '+' : num1 += num2; break;
    case '-' : num1 -= num2; break;
    case '*' : num1 *= num2; break;
    case '/' : num1 /= num2; break;
    default : return num1;
  }
  return num1;
};

#15

Можно и без него, сразу возвращать необходимые данные, соответственно и результат не придётся записывать в num1
А если хотите так оставить, то лучше результат не записывать в num1, а сделать отдельную переменную result. Цель писать не как можно короче, а хорошо читаемый код


#16

Ясно, спасибо.


#17

Если честно меня немного удивило, что тут не проходятся переключатели, но вот как по-сути надо было решить(чтоб совсем просто[и без мудрений]):

var calculate = function(firstNumber, secondNumber, operator) {
 var fN = parseInt(firstNumber);
 var sN = parseInt(secondNumber);
 var res = 0;
 switch(operator) {
   case '+': res = fN + sN; break;
   case '-': res = fN - sN; break;
   case '*': res = fN * sN; break;
   case '/': res = fN / sN; break;
   default: res = fN + sN;
   }
   return res;
  }

#18

странная обработка по умолчанию у вас. То есть, если по вашей логике передать в качестве оператора, допустим, такой символ & или %, то он вернет сумму? и почему сразу не возвращаете результат вычисления?


#19
function calculate(firstNumber, secondNumber, operator) {
  function calculateString(fn) { 
    return new Function('return ' + fn)();
  }      
  let resultInString = firstNumber + operator + secondNumber;
  resultOfCalculations = calculateString(resultInString);
  return resultOfCalculations;
}

либо с eval:
    function calculate(firstNumber, secondNumber, operator) {  
      let resultInString = firstNumber + operator + secondNumber; 
      resultOfCalculations = eval(resultInString);
      return resultOfCalculations;
    }

#20

Пошли по пути наименьшего сопротивление, но в реальности никто не использует ни eval ни new Function как eval в связи с безопасностью. В ваш калькулятор можно передать любой код и он выполнится - это серьезная проблема


#21

можно добавить проверку в конце:

if (typeof  resultOfCalculations !== 'function') {
  return resultOfCalculations;
}