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); })"
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.
peut-être que window['var' + num]
pourrait vous être plus utile. je ne comprends pas très bien votre question désolé.
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 .
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.
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
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
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
.