JS的淺拷貝和深拷貝

2021-10-05 04:48:15 字數 787 閱讀 5109

js的變數分為基本型別和引用型別,基本型別儲存在棧中,而引用型別實際物件儲存在堆記憶體中,棧中儲存著物件在堆記憶體的位址。一般我們對引用型別變數做淺拷貝(obj1 = obj2),只能複製棧中的記憶體位址給新物件,指向的仍是同一片記憶體區域,一旦修改摸乙個物件另乙個物件也會被改變。深度拷貝是相對於淺拷貝而言的,是另外開闢出乙個記憶體空間儲存另乙個一模一樣的引用物件。深拷貝和淺拷貝都是針對引用變數而言的,基本變數沒有這個概念。

json.parse(json.stringify(oldobj))
這個方法能處理的物件屬性只能是number、array、boolean、string等能被json表示的資料結構,對於regexp、function、undefined、symbol等屬性在轉換過程中就會被忽略。 

function deepcopy(obj) 

// for...in 遍歷物件自身和繼承的所有可列舉屬性

// hasownproperty判斷物件自身是否有該屬性,我們只拷貝物件自身的屬性

for(let key in obj) else

}} return result

}//或者這樣遍歷複製

object.keys(obj).foreach((key) => else

})

這時es6中的乙個新方法,用來將源物件的可列舉屬性複製給新物件

object.assign({}, source)
但是這個方法只能複製一層屬性,對於巢狀物件不能實現真正的深層拷貝

JS深拷貝和淺拷貝

js中物件分為基本型別和復合 引用 型別,基本型別存放在棧記憶體,復合 引用 型別存放在堆記憶體中 堆記憶體中用於存放由new建立的物件,棧記憶體存放一些基本型別的變數和物件的引用變數 對於簡單變數,記憶體小,直接複製不會發生引用 var a 123 var b a a 123456 console...

JS淺拷貝和深拷貝

1.淺拷貝 copy var obj1 物件存放於堆記憶體中,物件中的鍵值對,值可以為物件,可以為陣列.var obj2 obj1 物件,陣列之間只有引用賦值 obj2.name 撒哈哈 當改動物件obj2的時候,obj1的key對應的value也會更改這是淺拷貝 深拷貝 var obj1 var ...

js深拷貝和淺拷貝

走在前端的大道上 var m var n m n.a 15 這時m.a的值是多少 m.a會輸出15,因為這是淺拷貝,n和m指向的是同乙個堆,物件複製只是複製的物件的引用。深拷貝和上面淺拷貝不同,就是徹底copy乙個物件,而不是copy物件的引用,例如,還是之前的例子,我們這麼寫 var m var ...