我正在编写一些JavaScript代码来解析用户输入的函数(用于类似Electron 表格的功能).解析了公式I could后,将其转换为JavaScript并在其上运行eval()以生成结果.

然而,如果可以避免的话,我总是避免使用eval(),因为它是邪恶的(而且,无论对错,我一直认为它在JavaScript中更邪恶,因为要计算的代码可能会被用户更改).

那么,什么时候可以使用它呢?

推荐答案

我想花点时间来回答你问题的前提——eval()是"evil".编程语言人员使用的"evil"一词通常意味着"危险",或者更准确地说是"用一个看起来很简单的命令就能造成很多伤害".那么,什么时候可以使用危险的东西呢?当你知道危险是什么,当你采取适当的预防措施时.

现在,让我们来看一下使用eval()的危险.和其他事情一样,可能存在许多小的隐患,但两大风险——eval()被视为邪恶的原因——是性能和代码注入.

  • performance-eval()运行解释器/编译器.如果您的代码是编译的,那么这将是一个巨大的成功,因为您需要在运行时调用一个可能很繁重的编译器.然而,JavaScript基本上仍然是一种解释性语言,这意味着在一般情况下调用eval()不会对性能造成很大影响(但请参阅我下面的具体说明).
  • 代码注入-eval()可能在提升的权限下运行代码字符串.例如,以管理员/root身份运行的程序永远不会想要判断()用户输入,因为该输入可能是"rm-rf/etc/reportant-file"或更糟.同样,浏览器中的JavaScript没有这个问题,因为程序无论如何都是在用户自己的帐户下运行的.服务器端JavaScript可能会有这个问题.

关于你的具体案件.据我所知,您是自己生成字符串的,所以假设您小心地不允许生成"rm-rf某事-重要"这样的字符串,则不存在代码注入风险(但请记住,在一般情况下,代码注入风险为very very hard).此外,如果您在浏览器中运行,那么我认为代码注入是一个相当小的风险.

至于性能,您必须将其与编码的易用性进行权衡.我认为,如果要解析公式,最好在解析过程中计算结果,而不是运行另一个解析器(eval()中的解析器).但是,使用eval()编写代码可能会更容易,而且性能损失可能不会明显.在本例中,eval()似乎并不比任何其他可能为您节省时间的函数更邪恶.

Javascript相关问答推荐

详细更改参考价值:"

在Chart.js 4.4.2中移动到不同大小的容器时,图表不会调整大小

如何避免移动设备中出现虚假调整大小事件?

字节数组通过echo框架传输到JS blob

硬币兑换运行超时

为什么ngModel不能在最后一个版本的Angular 17上工作?'

如何添加绘图条形图图例单击角形事件

如何通过使用vanilla JS限制字体大小增加或减少两次来改变字体大小

如何在bslib nav_insert之后更改导航标签的CSS类和样式?

我的角模板订阅后不刷新'

400 bad request error posting through node-fetch

DOM不自动更新,尽管运行倒计时TS,JS

创建以键值对为有效负载的Redux Reducer时,基于键的类型检测

如何在Press上重新启动EXPO-AV视频?

如何根据查询结果重新排列日期

顶点图使用组标签更新列之间的条宽

JAVASCRIPT SWITCH CASE语句:当表达式为';ALL';

如何在Jest中模拟函数

AG-GRIDreact 显示布尔值而不是复选框

如何在Reaction中清除输入字段