陣列(引用型別)複製問題

2021-09-13 02:28:14 字數 1878 閱讀 2754

陣列賦值問題涉及到拷貝、堆疊空間、基本資料型別和引用資料型別的差異。(自行了解)

var arra = [1,2,3,4,5];

var arrb = arra;

// 把b陣列值重置成0;

arrb.fill(0);

console.log(arra);

console.log(arrb);

輸出結果是:arra = [0,0,0,0,0], arrb = [0,0,0,0,0]

arrb的修改的同時也修改了arra的值。

可採用淺拷貝和深拷貝解決問題:

var arra = [1, 2, 3, 4, 5];

var arrb = arra.slice(0, 5);

// 把b陣列值重置成0;

arrb.fill(0);

console.log(arra);

console.log(arrb);

輸出結果是:arra = [1, 2, 3, 4, 5], arrb = [0, 0, 0, 0, 0];

var arra = [1, 2, [3, 4], 5, 6];

var arrb = arra.slice(0, 5);

// 把b[2]陣列值重置成0;

for (var i = 0; i < arrb.length; i++)

} console.log(arra);

console.log(arrb);

輸出結果是:arra = [1, 2, [0,0], 5, 6], arrb = [1, 2, [0,0], 5, 6];

(object.assign({}, obja)物件淺拷貝)

var arra = [1, 2, [3, 4], 5, 6];

var arrb = json.parse(json.stringify(arra));

// 把b陣列值重置成0;

arrb[2].fill(0);

console.log(arra);

console.log(arrb);

輸出結果是:arra = [1, 2, [3, 4], 5, 6], arrb = [1, 2, [0, 0], 5, 6];

var arra = [1, undefined, [3, 4], 5, 6];

var arrb = json.parse(json.stringify(arra));

// 把b陣列值重置成0;

arrb[2].fill(0);

console.log(arra);

console.log(arrb);

輸出結果是:arra = [1, undefined, [3, 4], 5, 6], arrb = [1, null, [0, 0], 5, 6];

親測: json.parse(json.stringify(arra))json轉換是深拷貝,但是如果值為undefined會被轉為null。
let arra = [1, 2, [3, 4], 5, 6];

let arrb = _.clonedeepwith(arra);

// 把b陣列值重置成0;

arrb[2].fill(0);

console.log(arra);

console.log(arrb);

輸出結果是:arra = [1, undefined, [3, 4], 5, 6], arrb = [1, null, [0, 0], 5, 6];

可使用第三方庫如lodash封裝的方法。

js arr的陣列引用問題,複製陣列

今天練習時,我使用arr陣列,現在想要把新建乙個陣列儲存arr的資料,然後改變arr的值,等以後需要原來資料時候,就可以用了。然後我突然意識到乙個問題 我能直接 var newarr arr 嗎?不能啊。原因看下面 var arr 1 2,3 4 var newarr arr console.log...

引用型別陣列

什麼叫引用型別陣列?基本型別陣列的元素中放的都是基本資料型別 int等 引用型別陣列的元素中放的是從基本型別構造而來的類和其他複雜資料型別的位址。第一句話 stus是引用型別陣列的變數 簡稱引用 存在棧記憶體,裡面放的是物件實體的位址,new student 3 在堆記憶體建立了乙個student陣...

複製(基本型別和引用型別)

一 基本型別複製 可以理解為把原模板a複製在另外乙個資料夾存為b中,改變b的內容不影響a的內容。舉例如下 var num1 12 var num2 num1 num2 13 console.log num1 輸出為12,不受num2的影響二 引用型別複製 可以理解為兩個都指向同乙個位址,乙個變數改變...