js中的拷贝问题
2017-09-06 11:41
190 查看
浅拷贝的实现
// 浅拷贝函数 var dad = {name:'chen',age:18}; var son = {sex:'男'}; function clone(dad,son){ var son = son || {};//判断s对象是否存在,不存在则定义s为空对象 for (var prop in dad) { son[prop] = dad[prop]; }; return son;//返回s对象 }; print(clone(dad,son));
打印结果:
但是假如,对象里面有子对象
var person = { name: 'chen', age:18, man: { hight:188 } };
那么在复制时浅拷贝只是将子对象的一个引用地址复制给son对象;son和person里的man 属性都指向同一个对象,故改变任一个都能影响到另外一个:
例子如下:
var dad = { name:'chen', age:18, man: { hight:188 } } var son = { sex:'男' }; // 浅拷贝函数 function clone(dad,son){ var son = son|| {}; //判断s对象是否存在,不存在则定义s为空对象 for (var prop in dad){ son[prop]=dad[prop]; }; return son;//返回s对象 }; clone(dad,son); // 进行浅拷贝 son.name='ze'; console.log(son.name);//打印ze console.log(dad.name);//打印chen son.man.hight=1999; console.log(son.man.hight);//打印1999 console.log(dad.man.hight);//打印1999
打印结果:
解决办法: 浅拷贝----->深拷贝
深拷贝可以很好的解决引用类型的拷贝问题,采用递归的方法去复制拷贝对象,从而解决浅拷贝带来的弊端
var dad = { name:'chen', age:18, man: { hight:188 } } var son = { sex:'男' }; // 深拷贝函数 function clone(dad,son){ var son = son || {};//判断s对象是否存在,不存在则定义s为空对象 for (var prop in dad) { if (typeof dad[prop]=='object') { //三元运算,将s[prop]初始化为数组或者对象 son[prop] = (dad[prop].constructor === Array) ? [] : {}; clone(dad[prop],son[prop]); } else{ son[prop]=dad[prop]; } }; return son;//返回s对象 }; clone(dad,son); son.name='ze'; console.log(son.name);//打印ze console.log(dad.name);//打印chen son.man.hight=1999; console.log(son.man.hight);//打印1999 console.log(dad.man.hight);//打印188
打印结果:
参考文档:http://www.cnblogs.com/MECN/p/6606119.html
相关文章推荐
- JS对象浅拷贝与深拷贝问题实践
- 【微信小程序开发笔记】--偶遇js深拷贝与浅拷贝问题
- 浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
- js对象的深拷贝问题
- 使用slice方法进行js对象拷贝 得到新的对象 不再互相干扰 解决引用变量的指向问题
- JS 面试级问题之--浅拷贝和深拷贝的区别和实现方法?
- 常用JS调试工具使用方法,帮你快速定位问题(Firebug+ IE“开发人员工具”)
- js 的胖箭头问题
- JS字符串的问题
- JS作用域内存问题(2)
- 5种处理js跨域问题方法汇总
- js闭包解决ajax无法给外部变量赋值的问题
- 一些常见的问题与解决代码!(四)(JS)
- 关于分页 HTML 代码中的 Js 函数指定问题( 编号:20110705A0847 )
- 解决IE6-IE8 Js代码不执行问题
- 几个优秀的js框架的license问题,付费,版权,侵权
- 关于更新发布CSS和JS文件的缓存问题
- JSP使用ajaxFileUpload.js实现跨域问题
- jsp引入css,js等文件浏览器解析空白的问题
- js中apply和Math.max()函数的问题?