Альтернатива eval () javascript [дубликат]

этот вопрос уже есть ответ здесь:

Я работаю в основном с 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.