首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >eval()混淆两个with‘-’与递减运算符

eval()混淆两个with‘-’与递减运算符
EN

Stack Overflow用户
提问于 2022-04-28 09:29:14
回答 5查看 59关注 0票数 0

让我先说一句,我知道使用eval()被认为是错误的做法,但是我在一个纯粹基于客户端的应用程序上使用它,所以没有DB和后端。我只是用它来评价数学表达式。

假设我有一个字符串,它从一开始就从空格中删除:"1-(2-3)"。如果使用它调用eval(),则得到eval("1-(2-3)") == 1-(-1) == 2。

但这是个陷阱。由于一些复杂的原因(与这个问题无关),我必须首先对括号进行评估,并将括号替换为它的计算值。所以我会得到字符串"1--1"。但是,如果我像这样调用eval:eval("1--1"),它会将--解释为递减操作,并得到错误

Uncaught :后缀操作中无效的左侧表达式

例如,

代码语言:javascript
复制
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的错误,它是为了评估通用的代码,不仅仅是数学表达式,而是我如何解决这个问题?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2022-04-28 09:29:14

实际上,我考虑过这个问题,最简单的解决方案可能只是使用String.prototype.replaceAll()将所有出现的--替换为- -

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 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很重要,但另一个提示是:您可以查看反向波兰表示法,因为这种处理复杂方程的方法基本上是计算机思考的方式。它将帮助您理解如何正确计算较长的表达式,并使您的机制为当前版本可能面临的不同问题做好准备。

票数 1
EN

Stack Overflow用户

发布于 2022-04-28 09:33:30

在将值添加到外部字符串之前,可以为每个嵌套表达式填充空格。

代码语言:javascript
复制
x = '-1';
r = eval('1-' + ` ${x} `);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72041268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档