因此,咱们须要封装一个函数,来对对象进行拷贝,经过for in 循环获取基本类型,赋值每个基本类型,才能真正意义上的复制一个对象code
var obj = {a:10}; function copy(obj){ var newobj = {}; for ( var attr in obj) { newobj[attr] = obj[attr]; } return newobj; } var obj2 = copy(obj); obj2.a = 20; alert(obj.a); //10
这样就解决了对象赋值的问题。对象
3、深拷贝
可是这里存在隐患,若是obj中,a的值不是10,而是一个对象,这样就会致使在for in中,将a这个对象的引用赋值为新对象,致使存在对象引用的问题。blog
var obj = {a:{b:10}}; function copy(obj){ var newobj = {}; for ( var attr in obj) { newobj[attr] = obj[attr]; } return newobj; } var obj2 = copy(obj); obj2.a.b = 20; alert(obj.a.b); //20
所以,因为这个copy对象只是对第一层进行拷贝,没法拷贝深层的对象,这个copy为浅拷贝,咱们须要经过递归,来拷贝深层的对象。将copy改形成递归便可递归
var obj = {a:{b:10}}; function deepCopy(obj){ if(typeof obj != 'object'){ return obj; } var newobj = {}; for ( var attr in obj) { newobj[attr] = deepCopy(obj[attr]); } return newobj; } var obj2 = deepCopy(obj); obj2.a.b = 20; alert(obj.a.b); //10