2011-05-14 137 views
0
a="79 * 2245 + (79 * 2 - 7)"; 
b=""; 
c=["1","2","3","4","5","6","7","8","9","0","+","-","/","*"]; 
for (i=1;i<a.length;i++){ 
    for (ii=1;i<c.length;i++){ 
    b=(a.substring(0,i))+(c[ii])+(a.substring(i+1,a.length)); 
    alert(eval(b.replace(" ",""))); 
    } 
} 

我需要找出如何使它使我使用eval时,我知道输入不会停止脚本,并且如果它通常会使脚本崩溃而忽略它。我明白,eval不是一个好用的函数,但我想要一个快速简单的方法来解决这个问题。上面的代码试图输出所有的答案,包括上面任何数字,符号或空格的所有可能的替换。我代表它在字符串中的距离,ii代表它正在检查的符号。 a是原始问题,b是修改后的问题。如何清理JS eval输入?

+0

停止问题的人? – mellamokb 2011-05-14 01:45:41

+0

不要使用'eval'。你的问题总是有更好的解决方案。 – Raynos 2011-05-14 01:46:22

+0

你想查看每一个字符变化的表达式在'a'中是否正确? – 2011-05-14 01:56:06

回答

2

尝试捕捉异常的eval可能抛出,就像这样:

try{ 
    alert(eval(b.replace(" ",""))); 
} catch (e){ 
    //alert(e); 
} 
1

您可以检查一些特殊情况和避免与正则表达式或类似的一些行为,但肯定是有没有办法“,如果它通常会崩溃只是忽略它'

这就类似于停止问题,因为mellamokb指的是。除了运行脚本之外,脚本无法知道脚本的执行情况。

一个人应该非常小心地检查任何字符串去eval,并保持尽可能多的用户输入,除了真正简单和可验证的东西,如整数值。如果你能找到一个比所有更好的方式总共eval

对于计算示例,您可能最好将其正确解析为令牌,然后从该位置开始,而不是以字符串形式进行评估。

PS - 如果你真的想看看这些在a表达式中的一次性表达式,尽管它的缺点是eval有点有趣。您是否解释为什么您在评估之前立即修剪空白?我不认为我能想到它会影响结果的情况。对于(至少大多数)有效的表达,它没有什么区别,虽然它可能会改变一些无效的情况,但我不能想到它的确如此有意义的情况