var obj = { name:"人", legs:['腿1', '腿2'], heart:{ leftAtrium:"左心房", rightAtrium:"右心房" } }; /** * 对象浅克隆 * @param src 源对象 * @returns {*} * 浅克隆只会将源对象自身可枚举属性依次复制; * 不会对源对象的各个属性所包含的子对象递归复制 */ var shallowCopy = function(src){ var dObj = {}; for(var prop in src){ if(src.hasOwnProperty(prop)){ dObj[prop] = src[prop]; } } return dObj; } var shallowCopyObj = shallowCopy(obj);; console.log(shallowCopyObj); /* * 源对象的属性包含子对象,则源对象与目标对象的该属性指向同一个内存地址 * 测试如下 */ shallowCopyObj.heart.leftAtrium = "人工制造"; shallowCopyObj.legs.pop(); console.log(obj);
/** * 对象深克隆 * @param src 源对象 * @returns {*} * 深克隆会将源对象可枚举的个属性依次复制; * 并对源对象的各个属性所包含的zi对象进行递归复制 */ var deepCopy = function(src){ var str, retObj = src.constructor === Array ? [] : {}; if(typeof src != 'object'){ return; } else if(window.JSON){ str = JSON.stringify(src); retObj = JSON.parse(str); } else { for(var i in src){ if(src.hasOwnProperty(i)){ retObj[i] = typeof src[i] === 'object' ? deepCopy(src[i]) : src[i]; } } } return retObj; } var deepCopyObj = deepCopy(obj); console.log(deepCopyObj); /* * 源对象的属性包含子对象,则目标对象的该属性会指向一个新开内存地址 * 测试如下 */ deepCopyObj.heart.leftAtrium = "人工制造"; deepCopyObj.legs.pop(); console.log(deepCopyObj) console.log(obj);