JavaScript深拷貝 淺拷貝

2021-09-11 09:52:13 字數 3548 閱讀 5345

淺拷貝:淺拷貝只是複製了記憶體位址,如果原位址中的物件改變了,淺拷貝出來的物件也會相應改變。

深拷貝:開闢了一塊新的記憶體存放位址和位址指向的物件,原位址的任何物件改變了,深拷貝出來的物件不變。

淺拷貝陣列(只拷貝第一級陣列):

1.直接遍歷

var arr = [1,2,3,4];

function

copy(arg)

return newarr;

}var newarry = copy(arr);

console.log(newarry);

newarry[0] = 10;

console.log(newarry); // [10,2,3,4]

console.log(arr) // [1,2,3,4]

複製**

2.slice
var arr = [1,2,3,4]

var copyarr = arr.slice();

copyarr[0] = 10;

console.log(copyarr); // [10,2,3,4]

console.log(arr); // [1,2,3,4]

複製**

slice(start,end)slice()方法返回乙個陣列中複製出來的元素組成新陣列,start指起始元素下標,end指終止元素下標

slice()不帶任何引數時,預設返回乙個和原陣列一樣的新陣列

3.concat()

var arr = [1,2,3,4]

var copyarr = arr.concat();

copyarr[0] = 10;

console.log(copyarr); // [10,2,3,4]

console.log(arr); // [1,2,3,4]

複製**

array.concat(array1,array2,.......,arrayn)concat()方法用於連線兩個或多個陣列(不會改變原陣列,返回被連線陣列的副本)

然而如果第一級陣列元素是物件或陣列,上面三種方式都失效:
var arr = [

, ,

]var copyarr = arr.slice();

copyarr[0].number = 10;

console.log(copyarr); // [, ,]

console.log(arr); // [, , ]

複製**

淺拷貝物件(如果物件中的值不為陣列或物件)

1.直接遍歷

var obj = 

function

copy (arg)

for(let item in arg)

return newobj;

} var copyobj = copy(obj)

copyobj.name = "李四"

console.log(copyobj) //

console.log(obj) //

複製**

2.es6的object.assign
var obj = 

var copyobj = object.assign({},obj)

copyobj.name = '李四'

console.log(copyobj) //

console.log(obj) //

複製**

object.assign:用於物件的合併,將源物件(source)的所有可列舉屬性,複製到目標物件(target),並返回合併後的target

用法object.assign(target, source1, source2); 所以copyobj = object.assign({}, obj); 這段**將會把obj中的一級屬性都拷貝到{}中,然後將其返回賦給copyobj

3.es6擴充套件運算子

var obj = 

var copyobj =

copyobj.name = '李四'

console.log(copyobj)

console.log(obj)

複製**

擴充套件運算子(...)用於取出引數物件的所有可遍歷屬性,拷貝到當前物件之中

深拷貝

json.stringify()json.parse()

json.stringify把物件轉成字串,再用json.parse把字串轉成新的物件。

但是這種方法也有不少壞處,譬如它會拋棄物件的constructor。也就是深拷貝之後,不管這個物件原來的建構函式是什麼,在深拷貝之後都會變成object

這種方法能正確處理的物件只有number,string,boolean,array, 扁平物件,即那些能夠被json直接表示的資料結構。regexp物件是無法通過這種方式深拷貝。

也就是說,只有可以轉成json格式的物件才可以這樣用,像functionundefinedsymbol、迴圈引用的物件沒辦法轉成json

var obj1 =  };

var obj2 = json.parse(json.stringify(obj1));

console.log(typeof obj1.fun);

// 'function'

console.log(typeof obj2.fun);

// 'undefined' <-- 沒複製

複製**

使用遞迴函式實現乙個深拷貝的方法:
function

deepclone(obj) ;

if(obj && typeof obj === "object") else }}

}return objclone

} 複製**

javaScript淺拷貝 深拷貝

資料型別 js的資料型別有兩種 1.基本資料型別 數值 字串 布林 null undefined 值型別 存放在棧中,所以複製基本資料型別的值是會新開乙個棧記憶體 淺拷貝 如果我們要複製物件的所有屬性都不是引用型別時,就可以使用淺拷貝,實現方式就是遍歷並複製,最後返回新的物件。深拷貝 深度拷貝就是把...

javaScript淺拷貝 深拷貝

資料型別 js的資料型別有兩種 1.基本資料型別 數值 字串 布林 null undefined 值型別 存放在棧中,所以複製基本資料型別的值是會新開乙個棧記憶體 淺拷貝 如果我們要複製物件的所有屬性都不是引用型別時,就可以使用淺拷貝,實現方式就是遍歷並複製,最後返回新的物件。深拷貝 深度拷貝就是把...

javascript 淺拷貝和深拷貝

簡單的賦值就是淺拷貝。因為物件和陣列在賦值的時候都是引用傳遞。賦值的時候只是傳遞乙個指標。看下面的例項 var a 1,2,3 var b a var test var c test console.log a console.log b console.log test console.log b...