Permítanme comenzar diciendo que sé que usar eval() se considera una mala práctica, pero lo estoy usando en una aplicación que está puramente basada en el cliente, por lo que no hay bases de datos ni backends. Lo estoy usando solo para evaluar expresiones matemáticas.
Digamos que tengo esta cadena a la que se le han quitado los espacios desde el principio: "1-(2-3)" . Si llama a eval() con él, obtiene eval("1-(2-3)") == 1-(-1) == 2.
Pero aquí está el truco. Por algunas razones complejas (que son irrelevantes para esta pregunta), primero tengo que evaluar el paréntesis y reemplazar el paréntesis con su valor evaluado. Entonces obtendré la cadena "1--1" . Pero si llamo a eval así: eval("1--1") , -- interpretará como una operación de decremento y obtengo el error
SyntaxError no detectado: expresión del lado izquierdo no válida en la operación de sufijo
Por ejemplo,
const input = "1-(2-3)" const str = input.replace("(2-3)", eval("(2-3)")) console.log(str) // "1--1" const result = eval(str) // Here things go wrong. Eval parses `--` as the decrement operator. console.log(result)Sé que esto no es una falla de eval, está destinado a evaluar el código general, no solo las expresiones matemáticas, pero ¿cómo puedo solucionar esto?
otra opción es simplemente envolver eval en let str = input.replace("(2-3)", eval("(2-3)")) con paréntesis para que sea let str = input.replace("(2-3)", "(${eval("(2-3)")})") . Esa sería la solución más rápida para este problema en particular. Pero pueden surgir otros diferentes. Como mencionó Sharjeel, BODMAS es importante, pero otra sugerencia es: puede buscar en la notación polaca inversa , ya que esta forma de descifrar ecuaciones complejas es la forma en que las computadoras piensan básicamente. Le ayudará a comprender cómo calcular correctamente expresiones más largas y preparará su mecanismo para diferentes problemas que puede enfrentar con la versión actual.
En realidad, lo pensé y la solución más simple probablemente sea simplemente usar String.prototype.replaceAll() para reemplazar todas las apariciones de -- a - - .
const input = "1-(2-3)" let str = input.replace("(2-3)", eval("(2-3)")) console.log(str) // "1--1" str = str.replaceAll('--', '- -') const result = eval(str) console.log(result) // 2Puede rellenar con espacio para cada expresión anidada antes de agregar el valor a la cadena exterior.
x = '-1'; r = eval('1-' + ` ${x} `);