Alternative to eval() javascript [duplicat

2019-01-11 11:02发布

问题:

This question already has an answer here:

  • What are the Alternatives to eval in JavaScript? 8 answers

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); })"

回答1:

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.



回答2:

maybe using window['var' + num] might be more useful for you. i don't quite understand your question sorry.



回答3:

do you mean that you want to calculate an equation that you can't know until you've received it?

if so see Calculate string value in javascript, not using eval .

in short:

eval CAN be used sometimes, but only if the equation string comes from a trusted source, and there you need something like evaluating dynamic equations.



回答4:

If you can collect them under an object like root = {a: 1, b: 2}, then

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

can keep your res variable up to date whenever the a or b changes



回答5:

It looks like you are trying to do dynamic equations created by a user.

For example it could be 'a+b+c' or 'dog+cat', and you don't know.

The best way to handle user-input equations like that is to parse the text into tokens and then translate the tokens into values/operands.

That's a lot of work, but there are pre-rolled solutions. For example, math.js



回答6:

Check more alternatives to eval in this question and another one here which both might be considered a duplicate...

I understand this is a link only answer, but it will for sure be helpful to others searching for alteratives to eval.