破解遞迴爆棧的深拷貝
遞迴爆棧問題
函式 caller 執行時,呼叫其他函式 called ,js會在呼叫棧中新開乙個呼叫幀儲存作用域和上下文資訊,而caller的呼叫幀資訊仍需要儲存。而記憶體中呼叫棧儲存資訊有限,遞迴情況下,如果遞迴層次過深會導致呼叫棧耗光而引起stack overflow —— 爆棧。
遞迴深拷貝
functionclone(source) ;
for(var i in
source) else}}
return
target;
}
破解遞迴爆棧的深拷貝
functionclonedeep5(x) ;
//棧const looplist =[
];while
(looplist.length) ;
}for(let k in
data) );
} else}}
}return
root;}//
juejin.im/post/5c45112e6fb9a04a027aa8fe
data.hasownproperty(k) 改用
object.prototype.hasownproperty.call(data, "b") 原因
var myobject = object.create( null);myobject.b = 2;
("b" in
myobject);
//true
myobject.hasownproperty( "b");
//typeerror: myobject.hasownproperty is not a function
測試 clonedeep5
let param3 = object.create(null);param3.a ='xa1';
param3.c = function
()let param4 =clonedeep5(param3);
console.log(param4);
js遞迴深拷貝
深拷貝和淺拷貝的區別 淺拷貝 就是簡單的複製,用等號即可完成 let a let b a這就完成了乙個淺拷貝 但是當修改物件b的時候,我們發現物件a的值也被改變了 b.a 10 console.log a.a 10這是因為淺拷貝只複製了指向物件的指標,新舊物件共用同一塊記憶體,修改某乙個物件的同時也...
深拷貝淺拷貝,原型,型別校驗,遞迴深拷貝
遇見乙個問題,解決的時候衍生出了幾條底層原理。為此做一下總結 let arr 1 2 3 宣告乙個陣列,要求對陣列進行深拷貝 一 深拷貝和淺拷貝的區別 所有基礎資料型別 string,number,null,undefind,boolean 進行賦值時都是深拷貝 所有宣告的變數在賦值引用資料型別時,...
遞迴方式實現深拷貝
通常json.parse json.stringify 的方式進行深拷貝是不可以拷貝undefined function regexp等型別。遞迴拷貝可以解決此類問題 定義乙個深拷貝函式 接收目標target引數 function deepclone target 判斷如果當前的值是null的話 直...