【转】javascript中值传递,地址传递,引用传递的问题(使用js创建list对象时会用到)
function initEditModal_SI(node) {
if (node.siArray == undefined) {
node.siArray = new Object();
}
var sis = new Array();
// for (var index in node.siArray) {
// sis.push(node.siArray[index]);
// }
if (node.siArray != null) {
$.each(node.siArray, function (id, obj) {
if(obj != null){
var object = new Object();
object.id = obj.id;
object.ip = obj.ip;
object.name = obj.name;
object.portEnd = obj.portEnd;
object.portStart = obj.portStart;
sis.push(object);
}
});
};
。。。。。。。。。。。。。。。 }
原意是想:
new一个数组sis,可以自由修改数组 sis 里面的值,且不会影响到后台获得的node对象里面的siArray里面的值。
这样就可以在想reset这个页面的时候还可以用node对象去做reset,但是,发现,修改了sis数组的值,node.siArray里面的值也跟着变了。
那么,问题来了。
注释掉的部分就是出问题的部分。
为什么会有问题:
因为新建的数组,直接用的就是函数传递过来的参数的地址。(直接给push进去,push进去的不是值,而是值的地址)
所以在以后的代码中修改了做这个新建的数组,看似没有修改原来数据的值,但是在你再次使用原来的参数去初始化页面的时候发现这个时候,原来的参数的值。莫名其妙的改变啦。
这个时候只能用下面代替的方法,其实和clone的性质是一样的,完完全全的真真正正的clone一遍,
然后就可以随便修改这个值,用于页面操作。
只要不提交数据到后台去保存。那么本地的那个node.siArray(即传进方法的node.siArray)就不会被改变,
当然,当你保存数据的时候,这个全局参数才应该跟着刷新一下,才可以保持数据的一致。
至于string类型,不论是java还是js,还是c一旦声明了一个string 那他就固定了。就算修改他,也只是再新建一个而已。(这个东西在新手面试的时候经常被问到)
关于用js创建list对象的实例:
获取到json数据如下:
错误的写法:
var list = [];
var userObj = ret.UserList
var obj = new Object();
for ( i = 0; i < userObj.length; i++)
{
obj.text = userObj[i].RealName;
obj.status = userObj[i].UserId;
list.push(obj.slice());
alert(JSON.stringify(list));
}
这样获取的list的值都是最后一个的值,即都是"王二小"了。
正确的写法:
var list = [];
$.each(userObj, function(id, obj)
{
var object = new Object();
object.text = obj.RealName;
object.status =obj.UserId
list.push(object);
});
alert(JSON.stringify(list));
总结如下:
1.JS的基本类型,是按值传递的。
2.对于对象而言:分两种情况
(a).如果传递给函数的参数是对象,并且修改了这个对象的属性(某些字段的值),那么奇妙的问题就来了。原参数就被修改了。
(b).如果传递给函数的参数是对象,并且没有修改这个对象的属性的值,而是把对象作为一个整体来操作的话。原参数就没有被修改。
【转】javascript中值传递,地址传递,引用传递的问题(使用js创建list对象时会用到)的更多相关文章
- JS 中没有按地址(引用)传递,只有按值传递
很多人,包括我,受书本知识消化不彻底的影响,认为 JS 中参数有两种传递方式:数字.字符串等按值传递:数组.对象等按地址(引用)传递.对此种观点,我们要谨慎. var v1 = [] var v2 = ...
- Java 为值传递而不是引用传递
——reference Java is Pass by Value and Not Pass by Reference 其实这个问题是一个非常初级的问题,相关的概念初学者早已掌握,但是时间长了还是容易 ...
- 【Qt】信号和槽对值传递参数和引用传递参数的总结
在同一个线程中 当信号和槽都在同一个线程中时,值传递参数和引用传递参数有区别: 值传递会复制对象:(测试时,打印传递前后的地址不同) 引用传递不会复制对象:(测试时,打印传递前后的地址相同) 不在同一 ...
- java是值传递,还是引用传递?
原文地址:http://blog.csdn.net/zxmzfbdc/article/details/5401960 java到底是值传递,还是引用传递?以前国内的java开发者有过很多争论,由于& ...
- JavaScript中值类型和引用类型的区别
JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和布尔值.此外,JavaScript中还有两个特殊的原始值:null和undefined,它们既不是数字也不 ...
- JavaScript中的方法、方法引用和参数
首先,我们来看一段代码,如果觉得不甚明白的,则本文会对你有益: var player = function (e) { return (function f(m) { ...
- javascript中值传递与值引用的研究
今天重新看了一下<javascript高级程序设计>,其中讲到了javascript中的值传递和值引用,所以就自己研读了一下,但是刚开始没有明白函数中的参数只有值传递,有的场景好像参数是以 ...
- C/C++中的值传递,引用传递,指针传递,指针引用传递
在面试过程中,被面试官问到传值和传引用的区别,之前没有关注过这个问题,今天在网上找了一篇包含代码和图片的讲解文章,浅显易懂,遂转载备忘. 1. 值传递 void f( int p){ printf(& ...
- java方法中只有值传递,没有引用传递
public class Example { String testString = new String("good"); char[] testCharArray = {'a' ...
随机推荐
- 你得学会并且学得会的Socket编程基础知识(续)——Silverlight客户端
本文将在这个案例的基础上,加入一个特殊场景,利用Silverlight来实现客户端.有的朋友可能会说,其实是一样的吧.请不要急于下结论,有用过Silverlight的朋友都有这种体会,很多在标准.NE ...
- 使用Lazy<T>实现对客户订单的延迟加载
"延迟加载"是指在需要的时候再加载数据.比如获得一个Customer信息,并不会把该Customer的Orders信息一下加载出来,当需要显示Orders的时候再加载.简单来说,就 ...
- ios 中局部变量可以通过传递来进行管理和释放,借此可提高代码的內聚度
ios 中 局部变量可以通过传递来进行管理和释放,通过多使用局部变量,可以提高代码的內聚度.如下: -(void)someMethod { UILabel *label = [[UILabel al ...
- Mac 在启动eclipse时 Failed to load JavaHL Library解决方法
在Mac 10.9.1系统里, 在Eclipse中安装svn的插件,出现如下提示 方法一: 1.根据提示进入链接 http://subclipse.tigris.org/wiki/JavaHL 2. ...
- Eclipse 搭建struts2 spring3 hibernate3环境实战 待完善
1.struts2 目前是2.3版本,下载地址http://struts.apache.org/download.cgi struts2包 struts2-core-2.3.16.3.jar stru ...
- [Git] git代码统计
copy : https://www.cnblogs.com/liyropt/archive/2012/12/31/2841053.html 命令行 查看git上的个人代码量: git log --a ...
- 【BZOJ】【3240】【NOI2013】矩阵游戏
十进制快速幂+矩阵乘法+常数优化 听说这题还可以强行算出来递推式……然后乘乘除除算出来…… 然而蒟蒻选择了一个比较暴力的做法= = 我们发现这个递推的过程是线性的,所以可以用矩阵乘法来表示,$x=a* ...
- @Java类加载器及双亲委派模型
类与类加载器 虚拟机设计团队把类加载阶段的"通过一个类的全限定名来获取此类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这个 ...
- 掌握Sed命令
带书签PDF版,喜欢的话,欢迎多提意见和建议,你的支持是血蝙蝠最大的前进动力! http://download.csdn.net/detail/challenge_c_plusplus/6480007 ...
- Web页面切图和CSS注意事项
一.Asp.net中的线程池设置 在Asp.net的服务处理中,每当服务器收到一个请求,HttpRuntime将从HttpApplication池中获取一个HttpApplication对象处理此请求 ...