Извините, если мой вопрос непонятен, не знал, как это выразить!
Я пытаюсь создать функцию, которая принимает два числа и строку, содержащую оператор (например, '+', '-', '*', '/').
Я использовал .valueOf () в строке для извлечения оператора, однако аргументы num1 и num2, похоже, не оценивают переданные числовые параметры. Почему это происходит?
function calculate(num1, operator, num2) {
return `num1 ${operator.valueOf()} num2`;
}
undefined
calculate(2, '+', 1);
"num1 + num2" //result
@Pointy ... но eval () не является злом ... Я считаю, что переключатель может сделать эту работу.
@gaetanoM, и переключатель будет тем же, что и вторая часть этого комментария.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если я понимаю ваши требования, вы можете использовать eval() для достижения этой цели:
function calculate(num1, operator, num2) {
return eval(`${num1} ${operator} ${num2}`);
}
console.info(calculate(2, '+', 1)); // 3
В качестве альтернативы вы можете избежать использования eval(), используя блок переключения, который упростит отладку кода и сделает его потенциально более безопасным:
function calculate(num1, operator, num2) {
switch (operator.trim()) { // Trim possible white spaces to improve reliability
case '+':
return num1 + num2
case '-':
return num1 - num2
case '/':
return num1 / num2
case '*':
return num1 * num2
}
}
console.info(calculate(2, '+', 1)); // 3
Лучший способ сделать то, что вы хотите, - это использовать объект, который сопоставляет имена операторов с функциями.
const opmap = {
"+": (x, y) => x + y,
"-": (x, y) => x - y,
"*": (x, y) => x * y,
"/": (x, y) => x / y,
};
function calculate(num1, operator, num2) {
if (operator in opmap) {
return opmap[operator](num1, num2);
}
}
console.info(calculate(2, '+', 1));
Вы не можете делать то, что пытаетесь сделать, без использования
eval()илиnew Function(), если вы напрямую не исследуете параметр оператора и не отреагируете на него соответствующим образом.