破解遞迴爆棧的深拷貝

2022-09-15 11:42:13 字數 1105 閱讀 5040

破解遞迴爆棧的深拷貝

遞迴爆棧問題

函式 caller 執行時,呼叫其他函式 called ,js會在呼叫棧中新開乙個呼叫幀儲存作用域和上下文資訊,而caller的呼叫幀資訊仍需要儲存。而記憶體中呼叫棧儲存資訊有限,遞迴情況下,如果遞迴層次過深會導致呼叫棧耗光而引起stack overflow —— 爆棧。

遞迴深拷貝

function

clone(source) ;

for(var i in

source) else}}

return

target;

}

破解遞迴爆棧的深拷貝

function

clonedeep5(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的話 直...