前段時間面試, 面試官上來就問數組的深淺拷貝問題, 今天有時間, 剛好來總結一下.
首先, 什麼是深拷貝和淺拷貝呢? 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] | 如果數組是一個元素全爲基礎類型的一維數組, 那麼就是深拷貝, 否則就是淺拷貝 |