Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

113
Views
eval() confunde dos menos `--` con el operador decremento

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?

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

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.

about 4 years ago · Juan Pablo Isaza Report

0

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) // 2

about 4 years ago · Juan Pablo Isaza Report

0

Puede rellenar con espacio para cada expresión anidada antes de agregar el valor a la cadena exterior.

 x = '-1'; r = eval('1-' + ` ${x} `);
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!