js的深拷貝淺拷貝的實現方法

2022-07-26 09:03:10 字數 1445 閱讀 6483

首先深拷貝淺拷貝是基於堆的引用型別。

一、在棧中儲存字串、數字、布林值以及指向堆的位址等確定的固定值

使用另乙個變數d等於a,相當於d拷貝了a ,在棧記憶體中開闢了乙個新空間d

棧中ad兩個已經是互不相干變數,無論另乙個值怎麼變化都不會對其他值造成影響

二、堆中儲存函式、陣列、物件,這些可以新增,減少的不固定值

使用另乙個變數 d 等於陣列 a ,使用 d 拷貝 a ,只會在棧記憶體再存入乙個相同的位址,在堆中仍然指向的同乙個陣列

此時改變d的值,發現a的值也改變

淺拷貝僅僅只是拷貝了a在棧記憶體的堆位址,仍然和a共用乙個堆記憶體,而我們需要的是互不相干的a,d,d也擁有乙個獨立的堆記憶體,無論a改變還是d改變都不會影響另乙個,這就需要深拷貝

進一步拷貝屬性的辦法有許多種

陣列有兩個方法slice、concat,實現效果如下

可以看到使用這兩種方法將a拷貝到d,隨後改變d的值,發現a並沒有變化,但這並不是深拷貝,只是可以使a d的一級屬性不受影響

這樣也不會有影響,但是改變d[0][1]的值

當我們改變陣列d[0]中的二維陣列的值發現a的值也被更改,因此這陣列的這兩種屬性仍然是淺拷貝,兩個變數並沒有徹底的分離,此外還有...擴充套件運算子

包括使用for迴圈

遇到二維陣列都無法深拷貝

以下介紹幾種深拷貝的辦法

1.遞迴拷貝(不建議使用,**量很大)

2json方法拷貝(有侷限性,如果有undefined、null。會丟失)

3.jquery中的extend拷貝

let a=[0,1,[2,3],4];

let d=$.extend(true,,a);

JS中淺拷貝和深拷貝的使用,深拷貝實現方法總結

1 淺拷貝 兩個物件經過拷貝後雖然具有相同的屬性,但是他們都指向同乙個記憶體空間。操作會引起引用,同一位址的變數一起改變。let a let b a b.x 2 console.log b console.log a 2 深拷貝 兩個物件除了拷貝了一樣的屬性,沒有任何其他關聯 指向不同的記憶體空間 ...

js淺拷貝深拷貝

js淺拷貝深拷貝 對於想要複製的物件,如果物件裡面對應的值都是基本資料型別的,可以直接複製 也就是通過淺拷貝複製。如果對應的值有物件那麼淺拷貝是行不通的。會造成資料汙染。下面介紹淺拷貝與深拷貝實現方法。1.淺拷貝 let tem let copy for let key in tem 2.通過obj...

淺拷貝,深拷貝 js

堆和棧 基本型別 存放在棧中的簡單資料段,資料大小確定,記憶體空間大小可以分配。6種基本資料型別 undefined null boolean number和string,es6新增屬性symbol.他們是直接按值存放的,所以可以直接訪問。引用型別 存放在堆記憶體中的物件,變數實際儲存的是乙個指標,...