今天在写程序的时候出现了一个奇怪的情况,业务需求很简单,只是通过客户端的JS方法进行AJAX请求,传入后台的参数是一个订单子项号,在后台用beanshell通过ID获取订单子项并修改其还款状态后进行保存。
function passRefundApply(orderItemId){
//alert(orderItemId);
$.ajax({
type: "get",
url: "/openorder/control/updateRefundStatus",
data:"orderItemId="+orderItemId+"&refundStatus=P",
cache: false,
success: function(msg){
var result = eval("("+removeDivTag(msg)+")");
try{
if(result.result!="success"){
alert("修改失败,请重试!");
return;
}
}catch(e){
alert("修改失败,请重试!");
return;
}
$("#refundStatus_"+orderItemId)[0].innerHTML = "退款审核已通过";
}
});
}
因为该方法的调用入口是用过JS即时生成的:
$("#refundStatus_"+orderItemId)[0].innerHTML = "<a href=\"javascript:void(0);\" onclick=\"passRefundApply("+orderItemId+")\">审核通过</a> <a href=\"javascript:void(0);\" onclick=\"rejectRefundApply("+orderItemId+")\">审核拒绝</a>";
其中传入的订单子项ID是10201005021047710584,并确认了该数据在数据库中有相应的记录对应。但是在后台却无法通过传入的订单子项ID取到数据库中相应的数据,查看日志后发现传入的订单子项ID为10201005021047710000。通过跟踪,并借助firebug,发现ID在函数调用passRefundApply(10201005021047710584)时还是正常的,但是在函数passRefundApply中第一行alert出来已是10201005021047710000,原来是在传值后被默认的篡改了....
鉴于上述现象,做了个实验,用记事本新建一个htm文件,只在里面写入
<script>
alert(12345678900987654321);
</script>
那打出来的是什么呢?
是12345678900987654000.......精度丢失了。原本以为JS的弱类型很好用,结果在此处有着危险的陷阱,下次尽量在项目中使用字符串传值,加上引号以保万全。
此处补充下关于精度丢失的问题,Javascript的数字数据类型不区分整型数值和浮点型数值,所有数字都由浮点型表示。对于十进制数,Javascript能精确表示-9007199254740992(- 2的53次)到 9007199254740992(2的53次)之间(闭区间)的所有整数,超过的就会丢失位数的精度。可以参考《Javascript权威指南》。
分享到:
相关推荐
主要介绍了JavaScript实现在页面间传值的方法,涉及javascript传值的技巧,非常具有实用价值,需要的朋友可以参考下
javascript 两个页面之间传值 使用window.open()
主要介绍了JavaScript函数参数使用带参数名的方式赋值传入的方法,实例分析了javascript函数传递参数的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
javascript函数式编程 javascript函数式编程 javascript函数式编程
C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用
JavaScript解析url并根据传值配置页面
JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)...
java javascript javascript函数java javascript javascript函数java javascript javascript函数java javascript javascript函数java javascript javascript函数
javascript函数速查javascript函数速查javascript函数速查javascript函数速查
在Javascript中,声明函数时,不能对其参数类型进行任何限制。 在执行过程中,您始终必须手动检查参数的类型。 这意味着您可以使用任何类型的参数调用相同的函数。 这可能会导致无法预料的行为。 例如,根据其参数...
JavaScript函数式编程.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!
JavaScript 函数调用 JavaScript 函数有 4 种调用方式。 每种方式的不同方式在于 this 的初始化。 this 关键字 一般而言,在Javascript中,this指向函数执行时的当前对象。 Note 注意 this 是保留关键字,你不能...
js复选框左右传值 很简单~~~~~~~~~~~~~~~~~~~~
对于“JavaScript 函数参数是传值(byVal)还是传址(byRef)”这个问题,普遍存在一个误区:number,string等“简单类型”是传值,Number, String, Object, Array等“复杂类型”是传址。这样不对吗?为什么会有这样的...
第7节 JavaScript函数及应用.rar第7节 JavaScript函数及应用.rar第7节 JavaScript函数及应用.rar第7节 JavaScript函数及应用.rar第7节 JavaScript函数及应用.rar第7节 JavaScript函数及应用.rar第7节 JavaScript函数...
javascript高效编程和函数式编程指南书籍PDF,适合深入学习javascript
理解Javascript函数形式参数与arguments 在JavaScript中,函数的形式参数和arguments之间存在着微妙的关系。为了深入理解这方面的知识,我们需要首先了解形式参数和实际参数的概念。形式参数指的是定义方法时所明确...
js脚本如何访问服务器控件的值 服务器控件如何取js中变量的值 如何遍历界面上所有TextBox元素 让dropdownlist选择到指定项