首先深拷貝淺拷貝是基於堆的引用型別。
一、在棧中儲存字串、數字、布林值以及指向堆的位址等確定的固定值
使用另乙個變數d等於a,相當於d拷貝了a ,在棧記憶體中開闢了乙個新空間d
棧中a和d兩個已經是互不相干變數,無論另乙個值怎麼變化都不會對其他值造成影響
二、堆中儲存函式、陣列、物件,這些可以新增,減少的不固定值
使用另乙個變數 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.他們是直接按值存放的,所以可以直接訪問。引用型別 存放在堆記憶體中的物件,變數實際儲存的是乙個指標,...