JS筆記 淺拷貝和深拷貝

2021-09-26 05:37:06 字數 1174 閱讀 1418

淺度拷貝:

複製一層物件的屬性,並不包括物件裡面的為引用型別的資料,當改變拷貝的物件裡面的引用型別時,源物件也會改變。

如:

var obj = 

var obj1 = obj;

console.log(obj1.name);

//用函式封裝,淺拷貝

var obj2 = {};

function extend(a, b)

}//呼叫函式

extend(obj, obj2);

console.log(obj2.name, obj2.age, obj2.car);

深拷貝:

淺拷貝只在根屬性上在堆記憶體中建立了乙個新的的物件,複製了基本型別的值,但是複雜資料型別也就是物件則是拷貝相同的位址。

而深拷貝則是將乙個物件從記憶體中完整的拷貝乙份出來,從堆記憶體中開闢乙個新的區域存放新物件,且修改新物件不會影響原物件。

實現: 淺拷貝+遞迴

這裡的遞迴:

在程式中函式直接或間接呼叫自己,然後跳出結構,返回結果

遞迴的步驟(技巧)

假設遞迴函式已經寫好

尋找遞推關係

將遞推關係的結構轉換為遞迴體

將臨界條件加入到遞迴體中

var i=0

function f1()

console.log('hello');

}f1();//輸出6次"hello"

我們再回到深拷貝這個話題中

json.stringify()是目前開發過程中最常用的深拷貝方式,原理是把乙個物件序列化成為乙個json字串,將物件的內容轉換成字串的形式再儲存在記憶體中,再用json.parse()反序列化將json字串變成乙個新的物件。如:

var obj = 

}var obj1 = {};

//完成obj向obj1 的 深拷貝

function extend(a, b) else if (item instanceof object)

extend(item, b[key]);//item是a[key]下的物件,再複製給b[key]

}b[key] = a[key];}}

extend(obj, obj1);

console.log(obj1);

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