`

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引入了一种更加直观的...

    javascript函数式编程

    JavaScript函数式编程是利用JavaScript语言编写函数式风格代码的一种编程范式。函数式编程强调使用纯函数、避免副作用、函数的不可变性以及利用高阶函数等概念。通过阅读《JavaScript函数式编程指南》,读者可以了解...

    JavaScript函数式编程.pdf

    在JavaScript中,函数是一等公民,这意味着函数可以被赋值给变量、作为参数传递给其他函数以及作为其他函数的返回值。函数式编程强调纯函数(pure functions)和不可变性(immutability),纯函数指的是相同的输入...

    javascript 两个页面之间传值

    `window.open()`是JavaScript中的一个内置函数,用于打开新的浏览器窗口或者标签页,并可以指定新窗口的URL、尺寸以及窗口特性。 首先,我们来了解`window.open()`的基本语法: ```javascript window.open(url, ...

    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函数(源代码)

    JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)...

    qt 调用javascript函数 带参数

    本篇文章将深入探讨如何在Qt中调用JavaScript函数并传递参数,以实现更丰富的功能。 首先,Qt的Webkit模块是实现这一目标的关键。Qt Webkit是一个基于WebKit引擎的组件,它允许Qt应用渲染网页内容,并与网页进行...

    declare:明确声明Javascript函数中的参数类型

    在Javascript中,声明函数时,不能对其参数类型进行任何限制。 在执行过程中,您始终必须手动检查参数的类型。 这意味着您可以使用任何类型的参数调用相同的函数。 这可能会导致无法预料的行为。 例如,根据其参数...

    javascript 复选框左右传值

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

    JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享

    总结来说,JavaScript函数参数的传递始终是按值进行的,但对于引用类型的值,传递的是对象的引用,而不是对象本身。因此,函数内部可以修改对象的属性,而不会影响到对象的引用。只有在直接重新赋值给参数(如`x = ...

    QT和网页中的JavaScript函数进行相互调用的实现

    - 这里的回调函数用于处理JavaScript函数的异步返回结果,如果需要同步获取结果,可以使用`QWebEngineScript`来注册一个全局JavaScript对象,然后通过该对象调用JavaScript函数。 2. **JavaScript调用QT函数**: ...

    理解Javascript函数形式参数与arguments

    理解Javascript函数形式参数与arguments 在JavaScript中,函数的形式参数和arguments之间存在着微妙的关系。为了深入理解这方面的知识,我们需要首先了解形式参数和实际参数的概念。形式参数指的是定义方法时所明确...

    javascript实现浮动窗口传值

    标题中的“javascript实现浮动窗口传值”指的是在网页中使用JavaScript技术来创建一个浮动窗口(通常是弹出框或对话框)并与主页面或其他窗口进行数据交互。这种功能常见于提示信息、用户输入验证或者在不刷新整个...

    JavaScript函数式编程

    全书分别介绍了JavaScript函数式编程、一等函数与Applicative编程、变量的作用域和闭包、高阶函数、由函数构建函数、递归、纯度和不变性以及更改政策、基于流的编程、类编程。除此之外,附录中还介绍了更多函数式...

    javascript函数大全

    10. **函数参数默认值**:从ES6开始,函数参数可以设置默认值,如`function foo(x = 10) {}`。 11. **剩余参数与解构赋值**:`...rest`参数可以收集函数调用时传入的所有额外参数,而解构赋值可以方便地从数组或...

    JS 函数式编程指南 PDF

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

    javascript函数详解!

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

Global site tag (gtag.js) - Google Analytics