淺度拷貝:
複製一層物件的屬性,並不包括物件裡面的為引用型別的資料,當改變拷貝的物件裡面的引用型別時,源物件也會改變。
如:
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 ...