Альтернатива 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
.