`

Javascript函数数字类型参数传值隐患

阅读更多
         今天在写程序的时候出现了一个奇怪的情况,业务需求很简单,只是通过客户端的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>&nbsp;&nbsp;<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在不同页面间传递值的方法。 在提到的第一种方法中,我们通过在a.html页面中定义一个表单,并在...

    javascript函数式编程

    JavaScript函数式编程是一种编程范式,它强调将计算视为数据处理的过程,并且重视函数作为第一类公民,即函数可以作为变量赋值、作为参数传递、作为返回值返回。这种编程风格在JavaScript中尤其常见,因为它提供了...

    C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用

    C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用

    javascript指南和函数式编程

    3. **数组和集合**:学习JavaScript中的数组操作,如map、filter、reduce等高阶函数的运用,以及Set和Map等ES6新增集合类型的使用。 4. **函数**:理解闭包、作用域和this的关键概念,学习箭头函数的语法和特性。 5....

    javascript函数速查

    从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中,函数是一段可执行的代码块,它能够接收参数,执行特定任务,并可能返回结果。以下是关于JavaScript函数的详细讲解: 1. **函数定义**: - 无参函数定义:`function 函数名 () { 代码... }` - 有...

    javascript 复选框左右传值

    js复选框左右传值 很简单~~~~~~~~~~~~~~~~~~~~

    JavaScript函数式编程pdf

    1. 函数作为一等公民:在JavaScript中,函数是可以被赋值给变量、作为参数传递以及作为其他函数的返回值的。这一特性使得JavaScript非常适合函数式编程,因为我们可以灵活地操作和组合函数。 2. 高阶函数:高阶函数...

    swift 与 javascript 之间的相互调用及传值

    在Swift和JavaScript之间传递数据,可以是任何JSON序列化的类型,如字符串、数字、布尔值、数组和字典等。数据以字符串形式通过evaluateJavaScript或postMessage方法进行传递。在Swift端,我们使用JSONSerialization...

    JavaScript ES6函数式编程入门经典_javascript_

    5. **默认参数**:函数参数可以设置默认值,避免因未传递参数而导致的错误。例如,`function greet(name = 'World') { console.log(`Hello, ${name}!`); }`,如果未传入`name`,则使用默认值`World`。 6. **剩余...

    JS 函数式编程指南 PDF

    JavaScript中的函数是第一类对象,这意味着它们可以像其他值一样被赋给变量、作为参数传递、从函数中返回或存储在数据结构中。 书中提到的“一等公民的函数”,指的是函数在JavaScript中所享有的特殊地位。开发者...

    javascript函数详解!

    8. **函数参数的rest运算符` rest运算符(`...`)允许你在函数中接受不定数量的参数,它们会被收集到一个数组中。 ```javascript function log(...args) { console.log(args); } log(1, 2, 3); // 输出:[1, 2...

    javascript常用判断函数

    此外,JavaScript还有其他很多内置的判断函数,如`isNaN`、`typeof`等,它们分别用于检测一个值是否为非数字和确定变量的类型。 在编写JavaScript代码时,正确使用这些判断函数能提高代码的健壮性和可维护性。理解...

    Javascript函数与对象

    在JavaScript中,几乎一切都可以被视为对象,包括函数、数组、甚至原生类型如字符串和数字在特定情况下也可以表现为对象。对象是一组无序的属性集合,每个属性都有一个键值对形式。键是字符串(或者符号),而值可以...

    JavaScript 函数.pdf

    函数参数 函数可以接受参数,这些参数在函数调用时传递给函数。您可以在函数定义中指定这些参数。例如: ``` function myFunction(x, y) { // 这里是函数的代码 } ``` 函数返回值 函数可以返回值,这些值在函数...

    javascript函数及其用法

    12. **类型转换**:JavaScript有一些内置函数用于类型转换,如`Number(value)`将值转换为数字,`String(value)`将值转换为字符串,`Boolean(value)`转换为布尔值。 13. **错误处理**:`try...catch`结构用于处理...

    javascript(函数查询chm+语法pdf)

    5. **函数式(Functional)**:JavaScript 支持函数式编程风格,允许将函数作为参数传递,也可以作为值返回。 **JavaScript函数查询CHM文件:** `JavaScript参考手册.chm` 是一个帮助文件,包含JavaScript的所有...

Global site tag (gtag.js) - Google Analytics