js淺拷貝與深拷貝的區別和實現方式

2022-06-30 08:21:09 字數 905 閱讀 1499

var a = 1;

b = a; // 棧記憶體會開闢乙個新的記憶體空間,此時b和a都是相互獨立的

b = 2;

console.log(a); // 1

當然,這也算不上深拷貝,因為深拷貝本身只針對較為複雜的object型別資料。

當b=a進行拷貝時,其實複製的是a的引用位址,而並非堆裡面的值。

而當我們a[0]=1時進行陣列修改時,由於a與b指向的是同乙個位址,所以自然b也受了影響,這就是所謂的淺拷貝了。

那,要是在堆記憶體中也開闢乙個新的記憶體專門為b存放值,就像基本型別那樣,豈不就達到深拷貝的效果了

function deepclone2(obj)
缺點: 無法實現對物件中方法的深拷貝,會顯示為undefined

js深拷貝與淺拷貝區別,如何實現深拷貝

首先我們需要弄清楚什麼是淺拷貝,其實我個人覺得淺拷貝從性質上和事件冒泡一樣,當出現這種事件時就代表出問題了 首先要看看js資料的儲存空間 按儲存空間我們可以簡單將js資料分為兩大類 基礎變數,整個存在棧中。還有一種是匯入型別 例如 陣列 json物件 null等 他們的 名相當於乙個指標,而真正的變...

js實現深拷貝和淺拷貝

let obj let newobj obj.age.age 25 修改第二層的obj.age.age,newobj.age.age也會跟著變化 console.log newobj 複製 注意 資料的slice和concat方法也是淺拷貝,只能拷貝一層 原理 把乙個物件轉化成乙個字串,再把這個字串...

js實現深拷貝和淺拷貝

淺拷貝 思路 把父物件的屬性,全部拷貝給子物件,實現繼承。問題 如果父物件的屬性等於陣列或另乙個物件,那麼實際上,子物件獲得的只是乙個記憶體位址,不會開闢新棧,不是真正拷貝,因此存在父物件被篡改的可能。function deepcopy o for i in o return f 深拷貝 思路 遞迴...