Как преобразовать строку в значения?

Возвращается строка "value / 100" как преобразовать ее так чтобы подставлялось значение value и выполнялось деление


Ответы (2 шт):

Автор решения: Михаил Ребров

Решение в лоб

Первое, что приходит на ум, это вычисление выражения с помощью встроенных средств.
Для этого используется функция eval(), которая выполняет находящееся в строке вырожение.

var value = 500;
var result = eval("value / 100");
alert(result);

Но,к сожалению, первое не значит - лучшее.

Замечание 1:

Warning:
Выполнение кода JavaScript с текстовой строки - это невероятный риск для безопасности. Злоумышленнику слишком легко запустить какой угодно код, когда вы используете eval().
(C) Mozilla

Не используйте eval без необходимости!

eval() - опасная функция, которая выполняет код, 
проходящий со всеми привилегиями вызывателя. 
Если вы запускаете eval() со строкой, на которую могут влиять злоумышленники, 
то вы можете запустить вредоносный код на устройство пользователя 
с правами вашей веб-страницы/расширения. 
Наиболее важно, код третьей стороны может видеть область видимости, 
в которой был вызван eval(), что может может привести к атакам,
похожим на Function.

Также eval(),как правило, медленнее альтернатив, 
так как вызывает интерпретатор JS, тогда как многие другие
конструкции оптимизированы современными JS движками.

Есть безопасные (и быстрые!) альтернативы eval() 
для общих случаев использования.

Замечание 2:

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

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

Альтернатива №1

Т.к. функции в JS это объекты, то никто Вам не мешает создать объект функции с вашим выражением, которое вы можете запустить и получить нужное значение.

Function()

Прямой альтернативой eval() в рамках интрументов JavaScript является Function().
Как и eval(), Function() принимает какое-то выражение в виде строки для выполнения
Но в отличии от eval() он возвращает НЕ результат выполнения выражения, а анонимную функцию, которая будет выполнять ваше выражение.
Function() — считается более быстрой и безопасной альтернативой eval().

Function() и безопасность
Функции, созданные через конструктор Function, не имеют доступа к собственному контексту исполнения, т.е. они всегда создаются в глобальной области видимости. При выполнении таких функций, они смогут обращаться только к своим локальным переменным или к переменным в глобальной области видимости, но не к переменным в той области видимости, в которой вызывался конструктор Function. В этом они отличаются от использования eval(). Также в отличии от eval(), при использовании Function() вы не сможете использовать переменные, которые не были объявлены после конструктора вашей функции.

Работающий пример, с выражением из вопроса

var value = 500;
function evaluateExpression(expression)
{
  var func = new Function("return " + expression);
  return func();
}
var result = evaluateExpression("value / 100");
alert(result);

Альтернатива №2 или "как деды воевали"

Также стоит отметить что у Вас есть свобода работать с DOM.
И под свободой подразумевается, что вы можете вставлять на вашу страницу не только HTML, но и свои скрипты.

Соответственно, как вариант Вы можете добавить на вашу страницу тег <script> с содержанием вашего выражения.
А если быть точнее там будет вычисление вашего выражения с сохранением результата в глобальное пространство имен, откуда потом его можно будет извлечь и вернуть в качестве результата выполнения выражения.

function evaluateExpression(expression)
{
  var script = document.createElement("script");
  script.type = "text/javascript";
  script.text = "window.__lr = " + expression + ";";
  document.body.appendChild(script);
  document.body.removeChild(script);

  var r = window.__lr;

  return r;
}
var value = 500;
var result = evaluateExpression("value / 100");
alert(result);

За альтернативы eval благорим:
https://stackoverflow.com/a/11422865/4558866

Ссылки:

→ Ссылка
Автор решения: Meeeeeeetron

function evaluate(myString) {

  let value = myString.split(' ')[0]
  let number = myString.split(' ')[2]

  let result = Number(value) / Number(number)

  console.log(result)

}

let value = 1
evaluate("value / 100")

→ Ссылка