Альтернатива eval () javascript [дубликат]
этот вопрос уже есть ответ здесь:
- каковы альтернативы eval в JavaScript? 8 ответов
Я работаю в основном с javascript, Jquery, нокаутом и т. д.
то, что привлекло eval () ко мне, это
var a = 5;
var b = 10;
eval("a+b");
//Gives me output 15
примечание: Я работаю в тех случаях, когда значение a
и b
изменяется динамически
в моей работе я имею дело с большим количеством динамических объектов из json, нокаутом и т. д. Так что эвал решает большинство моих проблем. Но когда я читал, я обнаружил, что есть так много проблем с eval (), таких как замедление и т. д.
Я много искал и не нашел никакой замены eval (), когда мне нужно оценить уравнение, полученное как строка в уравнение как объект.
может ли кто-нибудь предложить плагин или функцию альтернативу eval() имея в виду пример, который я привел выше
:
я создаю таблицу из данных Json, используя отображение нокаута. Так что когда-либо формат json является таблицей, генерируется. Я также вычисляю некоторое поле, используя вычисленный нокаут. Прямо сейчас я использую hard-coded
self.Salary = ko.computed(function(){ return self.salaryEqn() && eval(self.salaryEqn()).toFixed(2); })
self.salaryEqn(salEqnTxt);
я хочу выполнить эти динамические уравнения. Я могу создать его dynamicaly как string, но для их оценки я проблема облицовка.
я хочу решение для
есть ли способ вычислить формулу, хранящуюся в строке в JavaScript, без использования eval?
формула
"self.Salary = ko.computed(function(){ return self.salaryEqn() && eval(self.salaryEqn()).toFixed(2); })"
6 ответов
Javascript - очень гибкий язык в этом отношении. Есть очень очень несколько случаев, когда eval()
правильный ответ на любой заданный вопрос, и это, конечно, не надо тут.
если a
и b
переменные являются частью объекта, вы можете получить к ним доступ со строковыми индексами:
ie myobj.a
также можно ссылаться как myobj['a']
.
из этого вы можете использовать переменную для индекса, и, таким образом, вы можете ссылка на любой элемент в myobj
динамически -- ie:
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
объект, поэтому вы все еще можете использовать эту технику даже с глобалами.
ie ваша глобальная переменная a
также можно получить доступ через window.a
или window['a']
, С последней опцией, позволяющей сделать то же самое dynamicProperty
трюк, описанный выше.
надеюсь, это поможет.
может быть, используя window['var' + num]
может быть более полезным для вас. я не совсем понимаю ваш вопрос Извините.
вы имеете в виду, что хотите вычислить уравнение, которое вы не можете знать, пока не получите его?
Если так посмотреть вычислить строковое значение в javascript, не используя eval .
короче:
eval можно использовать иногда, но только если строка уравнения исходит из надежного источника, и там вам нужно что-то вроде оценка динамических уравнений.
если вы можете собрать их под объект типа root = {a: 1, b: 2}
, потом
Object.observe(root, function(newValues) {
res = newValues.object.a + newValues.object.b;
});
может держать свой res
переменная в актуальном состоянии, когда a
или b
изменения
похоже, вы пытаетесь сделать динамические уравнения, созданные пользователем.
например, это может быть "a+b+c" или "собака+кошка", и вы не знаете.
лучший способ обработки пользовательских входных уравнений - это разбирать текст на токены, а затем переводить токены в значения/операнды.
Это много работы, но есть несколько готовых решений. Например, математика.js
проверить больше альтернатив eval
на этот вопрос и здесь которые оба могут считаться дубликатом...
Я понимаю, что это ссылка только ответ, но это наверняка будет полезно для других, ищущих изменения в eval
.