js中淺復制跟深復制的簡單實現
阿新 • • 發佈:2017-11-20
ole cnblogs log down ret arguments 地址 沒有 nts
深復制
是在堆中新開辟一塊內存地址用於存放復制的對象,新舊對象之間沒有影響。
淺復制
僅僅是指向被復制的內存地址,如果原地址的對象被改變裏,那麽淺復制出來的對象也會隨之改變。
淺復制的實現
function shallowClone(obj) { var objClone = {}; for (var i in obj) { objClone[i] = obj[i] } return objClone; } var obj = { name: ‘a‘, say: function () { console.log(‘hi~‘); } } var cloneObj = shallowClone(obj); console.log(cloneObj.name); console.log(cloneObj.say());
深復制的實現
function deepClone(obj, objClone) { var tempObj = objClone || {}; for(var i in obj) { var prop = obj[i]; //避免相互引用的對象導致死循環的情況,則應該在遍歷的時候判斷是否相互引用對象,如果是則退出循環。 if(prop === obj) { continue; } if(typeof obj[i] === ‘object‘) { tempObj[i] = (prop.constructor === Array) ? [] : {}; arguments.callee(prop, tempObj[i]) ; } else { tempObj[i] = obj[i]; } } return tempObj; } var obj1 = {}; var obj2 = { name: ‘a‘}; deepClone(obj2, obj1); console.log(obj1.name);
js中淺復制跟深復制的簡單實現