首页 > 代码库 > javascript 拷贝
javascript 拷贝
拷贝简单分为浅拷贝与深度拷贝,即给定一个对象,生成一个相同的对象。
浅拷贝
function copy(source,destiny){ destiny = destiny || {}; if(typeof(source) === ‘object‘){ // 是object或者array for(var i in source){ if(source.hasOwnProperty(i)){ destiny[i] = source[i]; } } }else{ //string number boolean,undefined null destiny = source; } return destiny;}
简单测试一下:
var ls = { a:12, b:22, c:{ c1:1, c2:2 }};var ld = copy(ls);console.log(ld);
结果:
[object Object] { a: 12, b: 22, c: [object Object] { c1: 1, c2: 2 }}
但是,如果改变新生成对象的值,再查看一下source对象
ld.c.c1=3;console.log(ls);
[object Object] { a: 12, b: 22, c: [object Object] { c1: 3, c2: 2 }}
发现source对象也被改变,说明,对于复杂对象(key对应的value值为对象),进行浅拷贝,key对应的使用的是同一个引用,很容易引起问题。
深拷贝
function deepCopy(source,destiny){ destiny = destiny || {}; var i; for( i in source){ if(source.hasOwnProperty(i)){ if(typeof(source[i]) === "object"){ destiny[i] = Object.prototype.toString.call(source[i]) === "[object Array]" ? [] : {}; deepCopy(source[i],destiny[i]); //递归调用 }else{ destiny[i] = source[i]; } } } return destiny;}
测试一下:
var s = { a:1, b:{ b1:2, b2:3 }, c:[4,5]};var d = deepCopy(s);
[object Object] { a: 1, b: [object Object] { b1: 2, b2: 3 }, c: [4, 5]}
d.b.b1=22;console.log(s);
console.log(s)对应的值:
[object Object] { a: 1, b: [object Object] { b1: 2, b2: 3 }, c: [4, 5]}
测试地址 : http://jsbin.com/higijadatalu/1/edit
javascript 拷贝
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。