Функция Javascript - преобразование строкового аргумента в оператор

Извините, если мой вопрос непонятен, не знал, как это выразить!

Я пытаюсь создать функцию, которая принимает два числа и строку, содержащую оператор (например, '+', '-', '*', '/').

Я использовал .valueOf () в строке для извлечения оператора, однако аргументы num1 и num2, похоже, не оценивают переданные числовые параметры. Почему это происходит?

function calculate(num1, operator, num2) {
  return `num1 ${operator.valueOf()} num2`;
}
undefined


calculate(2, '+', 1);
"num1 + num2"         //result

Вы не можете делать то, что пытаетесь сделать, без использования eval() или new Function(), если вы напрямую не исследуете параметр оператора и не отреагируете на него соответствующим образом.

Pointy 29.08.2018 23:39

@Pointy ... но eval () не является злом ... Я считаю, что переключатель может сделать эту работу.

gaetanoM 29.08.2018 23:40

@gaetanoM, и переключатель будет тем же, что и вторая часть этого комментария.

epascarello 29.08.2018 23:41
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если я понимаю ваши требования, вы можете использовать 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));

Другие вопросы по теме