今天在写程序的时候出现了一个奇怪的情况,业务需求很简单,只是通过客户端的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中,函数是一等公民,这意味着函数可以被赋值给变量、作为参数传递给其他函数以及作为其他函数的返回值。函数式编程强调纯函数(pure functions)和不可变性(immutability),纯函数指的是相同的输入...
JavaScript函数式编程是一种编程范式,它强调将计算视为数据处理的过程,并且重视函数作为第一类公民,即函数可以作为变量赋值、作为参数传递、作为返回值返回。这种编程风格在JavaScript中尤其常见,因为它提供了...
`window.open()`是JavaScript中的一个内置函数,用于打开新的浏览器窗口或者标签页,并可以指定新窗口的URL、尺寸以及窗口特性。 首先,我们来了解`window.open()`的基本语法: ```javascript window.open(url, ...
JavaScript解析url并根据传值配置页面
3. **数组和集合**:学习JavaScript中的数组操作,如map、filter、reduce等高阶函数的运用,以及Set和Map等ES6新增集合类型的使用。 4. **函数**:理解闭包、作用域和this的关键概念,学习箭头函数的语法和特性。 5....
本篇文章将深入探讨如何在Qt中调用JavaScript函数并传递参数,以实现更丰富的功能。 首先,Qt的Webkit模块是实现这一目标的关键。Qt Webkit是一个基于WebKit引擎的组件,它允许Qt应用渲染网页内容,并与网页进行...
从ES6开始,JavaScript允许为函数参数设置默认值,这样当传入的参数为undefined时,会使用默认值。例如: ```javascript function greet(name = 'Guest') { console.log('Hello, ' + name); } greet(); // Hello, ...
在Javascript中,声明函数时,不能对其参数类型进行任何限制。 在执行过程中,您始终必须手动检查参数的类型。 这意味着您可以使用任何类型的参数调用相同的函数。 这可能会导致无法预料的行为。 例如,根据其参数...
JavaScript 函数调用 JavaScript 函数有 4 种调用方式。 每种方式的不同方式在于 this 的初始化。 this 关键字 一般而言,在Javascript中,this指向函数执行时的当前对象。 Note 注意 this 是保留关键字,你不能...
在JavaScript中,函数是一段可执行的代码块,它能够接收参数,执行特定任务,并可能返回结果。以下是关于JavaScript函数的详细讲解: 1. **函数定义**: - 无参函数定义:`function 函数名 () { 代码... }` - 有...
js复选框左右传值 很简单~~~~~~~~~~~~~~~~~~~~
1. 函数作为一等公民:在JavaScript中,函数是可以被赋值给变量、作为参数传递以及作为其他函数的返回值的。这一特性使得JavaScript非常适合函数式编程,因为我们可以灵活地操作和组合函数。 2. 高阶函数:高阶函数...
JavaScript跨页传值有多种策略,从简单的URL查询参数到复杂的Web Storage和消息通信,开发者可以根据实际需求选择合适的方法。在选择过程中,应考虑数据的类型、安全性、存储限制以及性能等因素。在处理敏感数据时,...
在Swift和JavaScript之间传递数据,可以是任何JSON序列化的类型,如字符串、数字、布尔值、数组和字典等。数据以字符串形式通过evaluateJavaScript或postMessage方法进行传递。在Swift端,我们使用JSONSerialization...
5. **默认参数**:函数参数可以设置默认值,避免因未传递参数而导致的错误。例如,`function greet(name = 'World') { console.log(`Hello, ${name}!`); }`,如果未传入`name`,则使用默认值`World`。 6. **剩余...
全书共9章,分别介绍了JavaScript函数式编程、一等函数与Applicative编程、变量的作用域和闭包、高阶函数、由函数构建函数、递归、纯度和不变性以及更改政策、基于流的编程、类编程。除此之外,附录中还介绍了更多...
8. **函数参数的rest运算符` rest运算符(`...`)允许你在函数中接受不定数量的参数,它们会被收集到一个数组中。 ```javascript function log(...args) { console.log(args); } log(1, 2, 3); // 输出:[1, 2...
此外,JavaScript还有其他很多内置的判断函数,如`isNaN`、`typeof`等,它们分别用于检测一个值是否为非数字和确定变量的类型。 在编写JavaScript代码时,正确使用这些判断函数能提高代码的健壮性和可维护性。理解...