這是來自瀏覽器控制臺的示例
a=[[1,2,3],[3,2,1]]
b=[]
b.push(a)
a[0][0]=9
b.push(a)
在那種情況下,我期望 b 是
[[[1,2,3],[3,2,1]],[[9,2,3],[3,2,1]]]
但它會
[[[9,2,3],[3,2,1]],[[9,2,3],[3,2,1]]]
我附上截圖以更好地在瀏覽器中顯示結果:browser console with the same code as above and output
關于為什么會發生這種情況以及如何達到預期結果的任何想法?
uj5u.com熱心網友回復:
對于語言本身,沒有多維陣列 - 陣列中還有另一個陣列。是否包含陣列、普通物件、函式或原語都沒有關系。對于基元,它們的值將被復制。否則,將復制對物件的參考。
您可以通過在 和 的幫助下推送陣列內部陣列的副本來a實作。mapspread operator(...)
var a=[[1,2,3],[3,2,1]];
var b=[];
b.push(a.map(x=>[...x]));
a[0][0]=9;
b.push(a);
console.log(b);
uj5u.com熱心網友回復:
好的,根據這里的所有評論,特別是@code 的評論,以及另一篇文章(如何傳遞值而不是陣列的參考?)我能夠通過使用這個來實作結果:
b.push([]);
for(line of a){
b[b.length-1].push(a.slice(0));
}
編輯
Abhijeet 的建議也完美無缺:
b.push(a.map(x=>[...x]));
uj5u.com熱心網友回復:
在 JavaScript 中,物件是通過參考傳遞的,這意味著它的“副本”不是副本。它們指向 RAM 中的相同地址,因此改變一個參考會改變所有參考。
要適用于這種情況,如果您還不知道,陣列是特殊型別的物件。為了證明這一點,您可以typeof []在瀏覽器控制臺中運行。這意味著陣列繼承了“按參考傳遞”的行為,這意味著如果你這樣做let c = a了 run c[0] = 1,a也會被改變,反之亦然。
要解決此問題,您可以使用Array.prototype.slice:
const a = [[1, 2, 3], [3, 2, 1]];
const b = [];
Array.prototype.pushWithoutReference = function(add) {
for(let i = 0; i < add.length; i ) {
this[this.length] = add[i].slice(0);
}
}
b.pushWithoutReference(a);
a[0][0] = 9;
b.pushWithoutReference(a);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/436820.html
標籤:javascript 数组 多维数组
