Альтернатива eval() javascript

Я работаю в основном с javascript, JQuery, нокаутом и т.д.

То, что привлекло меня eval(), - это

var a = 5;
var b = 10;
eval("a+b");
//Gives me output 15

Примечание. Я работаю в случаях, когда значение a и b изменяется динамически

В моей работе я имею дело с большим количеством динамических объектов от json, нокаутом и т.д. Таким образом, eval решает большинство моих проблем. Но, как я читал, я обнаружил, что существует так много проблем с eval(), как замедление и т.д.

Я много искал и не нашел никакой замены для eval(), когда мне нужно оценить получение уравнения как строку в качестве объекта как объекта.

Может ли кто-нибудь предложить плагин или функцию, альтернативную eval(), имея в виду пример, приведенный выше

Проблема:

Я создаю таблицу из данных Json, используя отображение нокаутов. Итак, когда создается формат json, это таблица. Я также вычисляю какое-то поле с использованием вычисленного нокаута. Прямо сейчас я использую жестко закодированные

self.Salary = ko.computed(function(){ return self.salaryEqn() && eval(self.salaryEqn()).toFixed(2); })
self.salaryEqn(salEqnTxt); 

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

Я хочу решение для

Есть ли способ вычислить формулу, хранящуюся в строке в JavaScript, без использования eval?

Как и формула

 "self.Salary = ko.computed(function(){ return self.salaryEqn() && eval(self.salaryEqn()).toFixed(2); })"

Ответы

Ответ 1

Javascript - это очень гибкий язык в этом отношении. Очень мало случаев, когда eval() является правильным ответом на любой заданный вопрос, и он, безусловно, здесь не нужен.

Если ваши переменные a и b являются частью объекта, вы можете получить к ним доступ со строковыми индексами:

т.е. myobj.a можно также указать как myobj['a'].

Из этого вы можете использовать переменную для индекса, и таким образом вы можете ссылаться на любой элемент в myobj динамически - то есть:

var myobj = {a : 5, b : 10};

var dynamicProperty1 = 'a';
var dynamicProperty2 = 'b';

//gives 15.
alert( myobj[dynamicProperty1] + myobj[dynamicProperty2] );

Нет eval(). Вы можете построить строки dynamicProperty, как бы вы ни пожелали, поэтому существует практически бесконечная гибкость.

Если ваши переменные a и b являются глобальными, JS-глобалы в браузере на самом деле являются дочерними элементами объекта window, поэтому вы можете использовать эту технику даже с помощью глобальных переменных.

т.е. ваша глобальная переменная a также может быть доступна через window.a или window['a'], причем последняя опция позволяет вам выполнить тот же трюк dynamicProperty, описанный выше.

Надеюсь, что это поможет.

Ответ 2

возможно использование window['var' + num] может быть более полезным для вас. я не совсем понимаю ваш вопрос извините.

Ответ 3

Вы имеете в виду, что хотите рассчитать уравнение, которое вы не можете знать, пока не получили его?

если см. Вычислить строковое значение в javascript, не используя eval.

:

eval МОЖЕТ использоваться иногда, но только если строка уравнения поступает из надежного источника, и вам нужно что-то вроде для оценки динамических уравнений.

Ответ 4

Если вы можете собрать их под объектом типа root = {a: 1, b: 2}, то

Object.observe(root, function(newValues) { 
    res = newValues.object.a + newValues.object.b;
});

может сохранять вашу переменную res актуальной, если a или b изменяет

Ответ 5

Похоже, вы пытаетесь сделать динамические уравнения, созданные пользователем.

Например, это может быть "a + b + c" или "dog + cat", и вы не знаете.

Лучший способ обработки пользовательских уравнений ввода - это проанализировать текст в токенах, а затем перевести токены в значения/операнды.

Это много работы, но есть готовые решения. Например, math.js

Ответ 6

Проверьте альтернативы eval в этот вопрос и другой здесь, которые оба могут быть рассмотрены дубликат...

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