Alternative to eval() javascript

Okky picture Okky · Apr 16, 2013 · Viewed 76.5k times · Source

I work mainly with javascript, Jquery, knockout, etc

The thing that attracted eval() to me is

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

Note: I work in cases where the value of a and b changes dynamically

In my work I'm dealing with a lot of dynamic objects from json, knockout, etc. So eval solves most of my problems. But as I read I found there are so many issues with eval() like slowing down etc.

I searched a lot and haven't found any substitute for eval() when i have to evaluate equation obtaining as string into equation as object.

Can anyone suggest a plugin or function alternative to eval() keeping in mind the example i have given above

Problem:

I'm creating a Table from Json data using knockout mapping. So that what ever the format of json is the table is generated. I also calculate some field using knockout computed. Right now I use hard-coded

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

I want to execute these equations dynamic. I can create it dynamicaly as string but to eval them is the issue I'm facing.

I want solution for

Is there a way to calculate a formula stored in a string in JavaScript without using eval?

Like a formula

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

Answer

Spudley picture Spudley · Apr 16, 2013

Javascript is a very flexible language in this regard. There are very very few cases where eval() is the right answer to any given question, and it certainly isn't necessary here.

If your a and b variables are part of an object, you can access them with string subscripts:

ie myobj.a could also be referenced as myobj['a'].

From that, you can use a variable for the subscript, and thus you can reference any element in myobj dynamically -- ie:

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

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

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

No eval() required. You can build the dynamicProperty strings however you wish, so there's virtually infinite flexibility.

If your a and b variables are globals, JS globals in the browser are actually children of the window object, so you can still use this technique even with globals.

ie your global variable a could also be accessed via window.a or window['a'], with the latter option allowing you to do the same dynamicProperty trick described above.

Hope that helps.