JS深拷貝和淺拷貝

2022-03-07 14:14:02 字數 1445 閱讀 6015

對於字串型別 ,淺拷貝就是對值的複製

對於物件來說,淺拷貝就是對物件位址的複製,並沒有開闢新的棧,也就是複製的結果是兩個物件指向同乙個位址,修改其中乙個物件的屬性,則另乙個物件的屬性也會改變

而深複製則是開闢新的棧,兩個物件對應兩個不同的位址,修改乙個物件的屬性,不會改變另乙個物件的屬性。

例如:

var arr = ["one","two","three"];

var arrto =arr;

arrto[1] = "test";

document.writeln("陣列的原始值:" + arr + "

");//

export:陣列的原始值:one,test,three

document.writeln("陣列的新值:" + arrto + "

");//

export:陣列的新值:one,test,three

像上面的這種直接賦值的方式就是淺拷貝,很多時候,這樣並不是我們想要得到的結果,其實我們想要是arr的值不變,不是嗎?

方法一:js的slice函式 

var arr = ["one","two","three"];

var arrtoo = arr.slice(0); //從陣列下標0開始複製整個陣列

arrtoo[1] = "set map";

document.writeln("陣列的原始值:" + arr + "

");//

export:陣列的原始值:one,two,three

document.writeln("陣列的新值:" + arrtoo + "

");//

export:陣列的新值:one,set map,three

方法二:js的concat方法

concat() 方法用於連線兩個或多個陣列。

該方法不會改變現有的陣列,而僅僅會返回被連線陣列的乙個副本。

語法arrayobject.concat(arrayx,arrayx,......,arrayx)

說明返回乙個新的陣列。該陣列是通過把所有 arrayx 引數新增到 arrayobject 中生成的。如果要進行 concat() 操作的引數是陣列,那麼新增的是陣列中的元素,而不是陣列。

var arr = ["one","two","three"];

var arrtooo =arr.concat();

arrtooo[1] = "set map to";

document.writeln("陣列的原始值:" + arr + "

");//

export:陣列的原始值:one,two,three

document.writeln("陣列的新值:" + arrtooo + "

");//

export:陣列的新值:one,set map to,three

原博文位址

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 ...