web-dev-qa-db-fra.com

Alternative à eval () javascript

Je travaille principalement avec javascript, Jquery, KO, etc.

La chose qui m'a attiré eval () est

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

Remarque: je travaille dans les cas où la valeur de a et b change de manière dynamique.

Dans mon travail, je traite beaucoup d'objets dynamiques comme JSON, KO, etc. Donc, eval résout la plupart de mes problèmes. Mais au fil de ma lecture, j’ai constaté qu’il y avait beaucoup de problèmes avec eval (), comme ralentir, etc. 

J'ai beaucoup cherché et je n'ai trouvé aucun substitut à eval () lorsque je dois évaluer une équation en tant que chaîne en équation en tant qu'objet.

Quelqu'un peut-il suggérer un plugin ou une alternative à eval () en gardant à l'esprit l'exemple ci-dessus?

Problème:

Je crée une table à partir de données Json en utilisant un mappage masqué. Ainsi, quel que soit le format de JSON, la table est générée. J'ai aussi calculer certains champs en utilisant knock-out calculé . À l'heure actuelle, j'utilise codé en dur 

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

Je veux exécuter ces équations dynamiques. Je peux le créer dynamiquement sous forme de chaîne mais les évaluer est le problème auquel je suis confronté.

Je veux une solution pour

Existe-t-il un moyen de calculer une formule stockée dans une chaîne en JavaScript sans utiliser eval?

Comme une formule

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

Javascript est un langage très flexible à cet égard. Il y a très très rares cas où eval() est la bonne réponse à une question donnée et ce n'est certainement pas nécessaire ici.

Si vos variables a et b font partie d'un objet, vous pouvez y accéder avec des indices de chaîne:

c'est-à-dire que myobj.a pourrait également être référencé par myobj['a'].

À partir de là, vous pouvez utiliser une variable pour l'indice, vous permettant ainsi de référencer n'importe quel élément de myobj de manière dynamique, c'est-à-dire:

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

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

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

eval() non requis. Vous pouvez construire les chaînes dynamicProperty comme bon vous semble, pour une flexibilité pratiquement infinie.

Si vos variables a et b sont globales, les globales JS du navigateur sont en fait des enfants de l'objet window. Vous pouvez donc continuer à utiliser cette technique même avec des globals.

c'est-à-dire que votre variable globale a peut également être accédée via window.a ou window['a'], cette dernière option vous permettant d'effectuer le même tour dynamicProperty décrit ci-dessus.

J'espère que cela pourra aider.

15
Spudley

peut-être que window['var' + num] pourrait vous être plus utile. je ne comprends pas très bien votre question désolé.

3
Tyler

voulez-vous dire que vous voulez calculer une équation que vous ne pouvez pas connaître tant que vous ne l'avez pas reçue?

si tel est le cas, voir Calculez la valeur de la chaîne en javascript, sans utiliser eval

en bref:

eval PEUT être utilisé parfois, mais seulement si la chaîne d'équation provient d'une source fiable, et vous avez besoin de quelque chose comme évaluer les équations dynamiques.

2
user2264587

Si vous pouvez les collecter sous un objet tel que root = {a: 1, b: 2}, alors

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

peut garder votre variable res à jour à chaque changement de a ou b

1
erdysson

On dirait que vous essayez de créer des équations dynamiques créées par un utilisateur.

Par exemple, cela pourrait être 'a + b + c' ou 'chien + chat', et vous ne savez pas.

Le meilleur moyen de gérer de telles équations entrées par l'utilisateur consiste à analyser le texte en jetons, puis à les traduire en valeurs/opérandes.

C'est beaucoup de travail, mais il existe des solutions préremplies. Par exemple, math.js

0
matchdav

Vérifiez plus d’alternatives à eval dans cette question et une autre ici dont les deux pourraient être considérés comme des doublons ...

Je comprends que ceci est une réponse uniquement par lien, mais elle sera certainement utile aux autres personnes à la recherche d’alternatifs à eval.

0
Wilt