簡體   English   中英

Array.prototype.fill()與填充不同

[英]Array.prototype.fill() different from fill as I go

我正在研究將其結果輸出到2D數組中的問題,並隨即在每個元素中添加一個。

我盡可能簡化了代碼 ,以創建測試用例。 如果我隨即填充數組,則如下所示:

var a = [[], [], [] ,[] ,[], []];
var d1, d2;
for (d1 = 0; d1 < 6; d1++) {
    for (d2 = 0; d2 < 6; d2++) {
        a[d1][d2] = (a[d1][d2]) ? (a[d1][d2]) + 1 : 1; 
    }
}

我得到一個所有值均為1的2D數組。但是,如果我使用array.prototype.fill()預填充數組,如下所示:

var a = new Array(6).fill(new Array(6).fill(0));
var d1, d2;
for (d1 = 0; d1 < 6; d1++) {
    for (d2 = 0; d2 < 6; d2++) {
        a[d1][d2] += 1; 
    }
}

我得到一個充滿6s的2D數組。 即使我用舊的a[d1][d2] = (a[d1][d2]) ? (a[d1][d2]) + 1 : 1;替換a[d1][d2] += 1 a[d1][d2] = (a[d1][d2]) ? (a[d1][d2]) + 1 : 1; a[d1][d2] = (a[d1][d2]) ? (a[d1][d2]) + 1 : 1; ,(由於0和undefined都是虛假的,所以仍然可以使用)我仍然得到6s。

據我所知,我的代碼應僅遍歷每個元素,並將一個添加到先前的值。 它不應多次觸摸任何元素,因此它們都應為1。 我是否提前填充數組都沒有關系。

我的理解失敗在哪里?

Array.fill用於將數組的所有元素(從開始索引到結束索引)填充為靜態值。

不幸的是,這意味着如果您傳入一個元素(例如新數組),則該數組實際上將充滿對該同一個元素的許多引用。 換句話說, a未填充大小為6的六個數組; a填充有六個指向大小相同的數組的六個指針。

您可以在開發者控制台中輕松地驗證這一點:

var a = new Array(6).fill(new Array(6).fill(0));
a
>>> [Array[6], Array[6], Array[6], Array[6], Array[6], Array[6]]
a[0]
>>> [0, 0, 0, 0, 0, 0]
a[1]
>>> [0, 0, 0, 0, 0, 0]
a[0][1] = 1
a[0]
>>> [0, 1, 0, 0, 0, 0]
a[1]
>>> [0, 1, 0, 0, 0, 0]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM