JavaScript基礎----數組的深拷貝與淺拷貝

前段時間面試, 面試官上來就問數組的深淺拷貝問題, 今天有時間, 剛好來總結一下.

首先, 什麼是深拷貝和淺拷貝呢? JS中數據類型分爲基本數據類型和引用數據類型,基本類型存放在棧中,存的是值; 引用類型存放在堆中, 存的是地址。只有引用數據類型纔有深拷貝、淺拷貝的概念

深拷貝: 深拷貝是指, 在計算機中開闢了一塊內存地址用於存放複製的對象, 新對象與原對象不會相互影響;

淺拷貝: 淺拷貝是指複製的是對象的內存地址,如果原地址中對象被改變了,那麼淺拷貝出來的對象也會相應改變。

那麼數組的方法中, 哪些是深拷貝, 哪些是淺拷貝呢, 下面來列舉一下:

//slice方法
let arr = ["hello", { a: "world", b: 21 }, ["Bob", "Tom", "Jenny"]];
let arr1 = arr.slice();
arr[0] = "world";
arr[1].a = "aaa";
arr[2][0] = "Tony";
console.log(arr1, arr[1] === arr1[1], arr[2] === arr1[2]);  
//["hello", { a: "aaa", b: 21 }, ["Tony", "Tom", "Jenny"]], true, true


//concat方法
let arr = ["hello", { a: "world", b: 21 }, ["Bob", "Tom", "Jenny"]];
let arr1 = arr.concat([]);
arr[0] = "world";
arr[1].a = "aaa";
arr[2][0] = "Tony";
console.log(arr1, arr[1] === arr1[1], arr[2] === arr1[2]);  
//["hello", { a: "aaa", b: 21 }, ["Tony", "Tom", "Jenny"]], true, true


//...方法
let arr = ["hello", { a: "world", b: 21 }, ["Bob", "Tom", "Jenny"]];
let arr1 = [...arr];
arr[0] = "world";
arr[1].a = "aaa";
arr[2][0] = "Tony";
console.log(arr1, arr[1] === arr1[1], arr[2] === arr1[2]);  
//["hello", { a: "aaa", b: 21 }, ["Tony", "Tom", "Jenny"]], true, true
  深拷貝 or 淺拷貝
slice 如果數組是一個元素全爲基礎類型的一維數組, 那麼就是深拷貝, 否則就是淺拷貝
concat 如果數組是一個元素全爲基礎類型的一維數組, 那麼就是深拷貝, 否則就是淺拷貝
[...arr] 如果數組是一個元素全爲基礎類型的一維數組, 那麼就是深拷貝, 否則就是淺拷貝

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章