让我先说一句,我知道使用eval()被认为是错误的做法,但是我在一个纯粹基于客户端的应用程序上使用它,所以没有DB和后端。我只是用它来评价数学表达式。
假设我有一个字符串,它从一开始就从空格中删除:"1-(2-3)"。如果使用它调用eval(),则得到eval("1-(2-3)") == 1-(-1) == 2。
但这是个陷阱。由于一些复杂的原因(与这个问题无关),我必须首先对括号进行评估,并将括号替换为它的计算值。所以我会得到字符串"1--1"。但是,如果我像这样调用eval:eval("1--1"),它会将--解释为递减操作,并得到错误
Uncaught :后缀操作中无效的左侧表达式
例如,
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)
我知道这不是eval的错误,它是为了评估通用的代码,不仅仅是数学表达式,而是我如何解决这个问题?
发布于 2022-04-28 09:29:14
实际上,我考虑过这个问题,最简单的解决方案可能只是使用String.prototype.replaceAll()将所有出现的--替换为- -。
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
发布于 2022-04-28 10:28:13
另一种选择是,您只需在let str = input.replace("(2-3)", eval("(2-3)"))中用圆括号将eval包装,使其成为let str = input.replace("(2-3)", "(${eval("(2-3)")})")。这将是解决这一特殊问题的最快办法。但可能会出现不同的情况。正如Sharjeel所提到的,BODMAS很重要,但另一个提示是:您可以查看反向波兰表示法,因为这种处理复杂方程的方法基本上是计算机思考的方式。它将帮助您理解如何正确计算较长的表达式,并使您的机制为当前版本可能面临的不同问题做好准备。
发布于 2022-04-28 09:33:30
在将值添加到外部字符串之前,可以为每个嵌套表达式填充空格。
x = '-1';
r = eval('1-' + ` ${x} `);https://stackoverflow.com/questions/72041268
复制相似问题