当前位置:编程学习 > JAVA >>

莫名其妙的运算问题

今天遇到一个很奇怪的问题,我花费了N个小时才找到这个问题,但是这个问题本身却让我十分郁闷,接下来我们看这个问题。

描述:

需求是这样的:要把下面这个图片中列表里面的数据做统计,“当前页面统计”行是用javascript实现的,就是累加每个td中的数据然后赋给统计行的相应td,其中用到了jQuery。

 问题



 

这个过程看起来很简单,但是就是因为这简单的过程中出现了不可思议的问题,下面我们看代码:

1. <script type="text/javascript">  
2. $(function(){  
3.     var regex = /\d+\.*\d*/;  
4.     var trlen = $("#datalist > tbody > tr").length - 3;  
5.     $("#datalist > tbody > tr").each(function(i, elementf) {  
6.         if (i < trlen) {  
7.             $(elementf).children("td").each(function(j, elements) {  
8.                 if (j > 1 && j < 14) {//textContent  
9.                     var context = regex.exec($("#cursum").children("td").get(j-1).textContent)*1 + (regex.exec($(elements).text())==null?0:regex.exec($(elements).text())*1;  
10.                     $("#cursum").children("td").get(j-1).textContent=context;  
11.                 }  
12.             });  
13.         }  
14.     });  
15. });  
16. </script> 
其中最关键的代码是:

1. var context = regex.exec($("#cursum").children("td").get(j-1).textContent)*1 + (regex.exec($(elements).text())==null?0:regex.exec($(elements).text())*1;  
2.                     $("#cursum").children("td").get(j-1).textContent=context; 
它的作用就是循环每个td累加到统计行的td。
 
而出问题的代码是:

1. var context = regex.exec($("#cursum").children("td").get(j-1).textContent)*1 + (regex.exec($(elements).text())==null?0:regex.exec($(elements).text())*1; 
它的作用就是得到当前循环的td中的值,并且得到此时统计行对应td的值然后相加重新赋给统计行的td,开始的时候我是这样写算式的,结果产生的问题是执行这一行代码之后context的值永远都是 “+” 号后算式的值,而不会把“+” 号前面算式的值加上去,也就是说:

1. var context = 1 + 2;  
2. //执行后context的值为2,而不是3 
这很让人郁闷我试了几次都是如此,后来问了一下同事,尝试不同方法,最后终于搞定了,代码是这样的:

1. var context = (regex.exec($("#cursum").children("td").get(j-1).textContent)*1) + (regex.exec($(elements).text())==null?0:regex.exec($(elements).text())*1); 
其实就是把 “+” 号前半部分和后半部分各自加上小括号就可以了,这让我无法理解,是javascript解析算式有问题,还是我对javascript解析算是的特征不懂呢,不知道,还是请高手指点啊。
 
总结:
不过这也让我对javascript语言的安全性产生很大的怀疑,还有就是希望NODEJS不是如此。

 


摘自 DolphinBoy

补充:web前端 , JavaScript ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,