【转】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).如果传递给函数的参数是对象,并且没有修改这个对象的属性的值,而是把对象作为一个整体来操作的话。原参数就没有被修改。
相关文章
- HTML+JavaScript实现链式运动特效
- 【Js】前端使用xlsx.full.min.js读取和导出excel表格数据
- js_JavaScript中有六种值为“假”
- 【Javascript/Vue】如何解决js中超链接跳转到新的页面不被浏览器拦截?(已解决,代码实例,亲测有效)
- 前端基础 - JavaScript之this关键字
- JavaScript - 实现点击按钮复制文本框内容到剪贴板(原生JS)
- JavaScript - 删除一维数组指定元素(移除一维数组某个项,删除指定的数组元素)
- JavaScript: setTimeout & setInterval
- javascript 打印错误信息 catch err
- 如何选择Javascript模板引擎(javascript template engine)?
- 【JavaScript】JS_Object跟Function的区别
- 《你不知道的JavaScript》读书笔记(二)词法作用域
- 《JavaScript入门经典(第6版)》——1.6 DOM简介
- 《深入理解JavaScript》——1.8 字符串
- 【javascript】 的严格模式 详解
- 关于URL编码/javascript/js url 编码/url的三个js编码函数
- JavaScript 每天更新小案例,有需要的一起学习呀:(第一天)
- Javascript 实现复制(Copy)动作方法总结
- JavaScript中 == 和 === 的区别
- 【HarmonyOS】【JS】 鸿蒙js开发使用div自带的scroll,滑动条拉不到最下面?
- javascript是什么?
- JavaScript对象详解,深入理解js对象
- JavaScript经典实例之分页(简单易用)原生js封装分页(一次性数据)
- JavaScript实战代码复制,包含JS这种场景
- JavaScript 模块化历程