深拷貝和淺拷貝的理解

2021-08-17 14:22:59 字數 2371 閱讀 9606

為什麼要使用深拷貝和淺拷貝?

當你想複製乙個物件時,一般做法是obj2=obj1,但是當你改動obj2的時候,會影響到obj1,而obj1也會影響到obj2,所以需要深拷貝和淺拷貝來解決物件的直接賦值仍然『連線』的問題。

淺拷貝:複製乙份引用,讓所有引用物件指向乙份資料,並且可以修改這份資料,即只對指標拷貝,並都指向同乙個記憶體空間。系統預設淺拷貝。

拷貝時只拷貝一級元素,不能拷貝子元素
es5和es6的淺轉殖不一樣,es6的更簡單,而es5中用到for..in..的語法,

給乙個物件,編寫乙個函式,使其可以拷貝乙個物件,返回這個拷貝得到的新物件

demo:

解構賦值(淺拷貝)

function

clone

(obj);

}var a =

var b = clone(a);

console.log(b.d[1]); //1

b.d[1] = 2;

console.log(b.d[1]); //2

console.log(a.d[1]); //2

object.assign()淺拷貝

function

clone

(obj),obj);

}

object.assign() 方法用於將所有可列舉屬性的值從乙個或多個源物件複製到目標物件,允許至少兩個引數,第乙個引數為拷貝的目標物件,在方法執行結束後會被返回,其餘引數將作為拷貝**。

深拷貝:複製變數值,對於非基本型別的變數,則遞迴至基本型別變數後,再複製。

array的slice和concat

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

var arrtoo = arr.slice(0);

arrtoo[1] = "set map";

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

");//export:陣列的原始值:one,two,three

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

");//export:陣列的新值:one,set map,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

json物件的paese和stringify

缺點:深拷貝之後,不管這個物件原來的建構函式是什麼,在深拷貝之後都會變成object。同時如果物件中存在迴圈引用的情況也無法正確處理。

demo:

var source =  } 

var target = json.parse(json.stringify(source));

target.name = "target"; //改變target的name屬性

console.log(source.name); //source

console.log(target.name); //target

target.child.name = "target child"; //改變target的child

console.log(source.child.name); //child

console.log(target.child.name); //target child

//例2

var source = , child: }

var target = json.parse(json.stringify(source));

console.log(target.name); //undefined

//例3

var source = , child:new

regexp("e") }

var target = json.parse(json.stringify(source));

console.log(target.name); //undefined

console.log(target.child); //object {}

理解「淺拷貝」和「深拷貝」

淺拷貝 將原物件 原陣列 的 引用 直接賦給新物件 新陣列 新物件 新陣列 是原物件 原陣列 的乙個引用。如果改變這個新物件 新陣列 原物件 原陣列 就會改變。深拷貝 將原物件的各項屬性的 值 陣列的所有元素 都拷貝給新物件 新陣列 是拷貝的 值 而不是 引用 為什麼要使用深拷貝?希望改變新物件 新...

深拷貝和淺拷貝的理解

物件之間賦值本質上 是物件之間的引用傳遞而已。也就是多個物件指向同乙個資料空間。淺拷貝是對乙個物件的頂層資料的拷貝。深拷貝是對於乙個物件所有層次的拷貝 遞迴 注意 型別 int型別,long型別 python3已去除long型別,只剩下int型別的資料 屬於物件,不是變數 深淺拷貝的作用 1,減少記...

淺拷貝,深拷貝的理解

淺拷貝 淺拷貝是將物件的每個屬性進行依次複製,當物件的屬性值是引用型別,實質複製的是其引用,指向的值改也會跟著變化,淺拷貝只拷貝一層 深拷貝 深拷貝複製變數值,對於非基本型別的變數,則遞迴至基本型別變數後,在複製,深拷貝後的物件與原來的物件是完全隔離的,互不影響,深拷貝是層層拷貝 淺拷貝 操作 簡單...