【微信小程序开发笔记】--偶遇js深拷贝与浅拷贝问题
2017-09-19 14:34
507 查看
微信小程序开发笔记(一)–偶遇深拷贝与浅拷贝问题
js文件/** * 选择数据--checkbox复选框监听事件value值 | 需要上传的数据 | 不需要上传的数据 */ checkboxChange: function (e) { //不需要上传的数据 var noNeedToUpLoad = new Array() //需要上传的数据 var needToUpLoad = new Array() //删除后需要上传的数据 var fUpLoad = new Array() //选择的企业数据 var checkedRegNo = e.detail.value; // var allDataleng = this.data.moreLocal.length; //取出需要上传的数据 for (var i = 0; i < allDataleng; i++) { var tmpobj = this.data.moreLocal[i]; var regNo = tmpobj.REGISTERNO; var isck = 1; for (var j = 0; j < checkedRegNo.length; j++) { if (regNo == checkedRegNo[j]) { isck = 2; break; } } if (isck == 1) { noNeedToUpLoad.push(tmpobj); } else { needToUpLoad.push(tmpobj); } } //最简单的深拷贝实例,将数组对象转为字符串之后就与源对象无关联,再将字符串转为数组对象 | //深拷贝√ | 浅拷贝 fUpLoad = JSON.parse(JSON.stringify(needToUpLoad)) //大方删除不需要的数据 for (var l = 0; l < fUpLoad.length; l++) { delete fUpLoad[l].EQUIPADDRESS; delete fUpLoad[l].EQUIPMENTTYPE; delete fUpLoad[l].INCHECKDATE; delete fUpLoad[l].OUTCHECKDATE; delete fUpLoad[l].USENO; delete fUpLoad[l].registerNo; delete fUpLoad[l].unitName; } this.setData({ upLoadData: fUpLoad, noUpLoadData: noNeedToUpLoad, }) console.log('不不不不需要上传的数据noNeedToUpLoad==============:'), console.log(noNeedToUpLoad); console.log('需要上传的数据needToUpLoad==============:'), console.log(needToUpLoad); console.log('最终需要上传的数据fUpLoad==============:'), console.log(fUpLoad); },
代码场景:
1. 这段代码中,
this.data.moreLocal在
data({})中定义为数组,存放目标对象
2. 需要通过
checkboxChange方法将
checkbox-group的
value值选择出来
3. 当
value值与目标对象
moreLocal[i].REGISTERNO相等即为要上传的数据
needToUpLoad,否则不上传
needToUpLoad。
4. 然后将需要上传的数据删减某些元素后再进行上传
fUpLoad
貌似思路很清晰,流程很顺畅,但是当在使用的时候,才发现,倘若使用
fUpLoad = needToUpLoad直接将需要上传的赋值出来,在对
fUpLoad中的元素执行删减
delete这一操作的同时,会发现原来的
needToUpLoad也会跟着变化,因为这就涉及到
JavaScript语言中的深拷贝和浅拷贝的问题。
那什么是深拷贝浅拷贝呢?
简单理解来说,深拷贝和浅拷贝针对于
Object和
Array的复杂对象来说的:
浅拷贝只是对对象的地址的复制,并没有开辟新的栈内存,也就是
fUpLoad、
needToUpLoad都指向同一个栈地址,对其中一个进行删减时,另外一个的值也会同样发生变化,这肯定不是想要看到的结果;
深拷贝则是拷贝了对象后存放到新的栈中保存,两者指向不同的栈,改变其中一个值并不会影响到另一个的值。
大致了解了是什么就找找方法进行深拷贝吧,但是最后发现
js的
slice函数和
concat方法都达不到该效果,
needToUpLoad是一个数组,数组元素又是一个对象,即使遍历
needToUpLoad后一个个拷贝出来,也不能够达到深拷贝的目的
最简单的一个深拷贝方法:一个简单但是很有效的方法,就是代码中的
fUpLoad = JSON.parse(JSON.stringify(needToUpLoad)),将数组对象转为字符串之后就与源数组无关联,再将字符串转为数组对象,即可达到深拷贝的目的
那在对
fUpLoad进行删减元素时就不会影响到原来的数组了
代码片段直接使用了项目中的一段,没有写一下示例代码,谨以此当做记录一下笔记吧
参考:javascript中的深拷贝和浅拷贝?
相关文章推荐
- 【微信小程序开发笔记】--苹果手机的悬浮按钮居中问题
- 微信小程序开发之真机测试 地图定位 map API 无法获取当前位置的问题
- 微信小程序开发常见问题分析
- 微信小程序开发过程中遇到的问题
- 小程序开发遇到问题如何联系微信官方
- 移动开发之【微信小程序】的原理与权限问题以及相关的简易教程
- 微信开发 JS-SDK 6.0.2 经常遇到问题总结
- 微信开发,解决jquery.qrcode.min.js生成二维码长按不识别问题
- 微信小程序开发之不能使用eval函数的问题
- Mac上微信小程序官方开发工具卡死的问题
- 韩顺平_轻松搞定网页设计(html+css+javascript)_第19讲_js运行原理_js开发工具介绍_js程序(hello)_js基本语法_学习笔记_源代码图解_PPT文档整理
- 微信小程序HotApp云笔记开发问题总结 之textarea不能实时保存及里面的值的获取的问题?
- 微信小程序开发过程中遇到的问题
- 微信JS SDK开发 共享问题小结
- 微信小程序开发教程(基础篇)3-app.js 解析
- 微信小程序开发所面临的三大问题
- 微信小程序开发之常见问题 不在以下合法域名列表中 wx.request合法域名配置
- 微信小程序开发之checkbox以及js数据配置和事件处理