JavsScript:別往Array.fill()方法傳入對象

先來看問題,我想創(chuàng)建一個(gè)二維數(shù)組,初始化為0,某些條件下數(shù)值改為1.

// 初始化[[0,0],[0,0],[0,0]]
let array = new Array(3).fill([0,0]);
//改變array[1][0]的值為1
array[1][0] = 1;
// 理想結(jié)果:[[0,0],[1,0],[0,0]]
console.log(array);// [[1,0],[1,0],[1,0]]

很明顯,結(jié)果和想像的很不一樣,我只想改變array[1][0]的值,但結(jié)果是二維數(shù)組里面每個(gè)數(shù)組的都被動(dòng)了。

查一下MDN文檔

fill 方法是個(gè)可變方法, 它會改變調(diào)用它的 this 對象本身, 然后返回它, 而并不是返回一個(gè)副本。
當(dāng)一個(gè)對象被傳遞給 fill方法的時(shí)候, 填充數(shù)組的是這個(gè)對象的引用。

看下面例子:

// Objects by reference.
var arr = Array(3).fill({}) // [{}, {}, {}];
// 需要注意如果fill的參數(shù)為引用類型,會導(dǎo)致都執(zhí)行都一個(gè)引用類型
// 如 arr[0] === arr[1] 為true
arr[0].hi = "hi"; // [{ hi: "hi" }, { hi: "hi" }, { hi: "hi" }]

也就是說,無論在fill()傳入多少個(gè)對象,這些對象都是同一個(gè),修改哪一個(gè),都會全部被改了。

最后,補(bǔ)充一下fill的語法

arr.fill(value[, start[, end]]);

第一個(gè)參數(shù)value:用來填充數(shù)組元素的值。
第二個(gè)參數(shù)start (可選的): 起始索引,默認(rèn)值為0。如果 start 是個(gè)負(fù)數(shù), 則開始索引會被自動(dòng)計(jì)算成為 length+start。
第三個(gè)參數(shù)end (可選的): 終止索引,默認(rèn)值為 this.length。如果 end 是個(gè)負(fù)數(shù), 則結(jié)束索引會被自動(dòng)計(jì)算成為 length+end。

// MDN上的例子
[1, 2, 3].fill(4);               // [4, 4, 4]
[1, 2, 3].fill(4,0,3);         // [4, 4, 4],相當(dāng)于[1, 2, 3].fill(4);

[1, 2, 3].fill(4, 1);            // [1, 4, 4]
[1, 2, 3].fill(4, 1, 2);         // [1, 4, 3]
[1, 2, 3].fill(4, 3, 5);         // [1, 2, 3]

[1, 2, 3].fill(4, 1, 1);         // [1, 2, 3]
[1, 2, 3].fill(4, 3, 3);         // [1, 2, 3]
[1, 2, 3].fill(4, NaN, NaN);     // [1, 2, 3]

[1, 2, 3].fill(4, 0, 1);          // [4, 2, 3]
[1, 2, 3].fill(4, -3, -2);       // [4, 2, 3],start=-3+3=0, end=-2+3=1, 相當(dāng)于[1, 2, 3].fill(4, 0, 1);

回到開頭的初始化方法

let array = new Array(3);
for(let i=0;i<3;i++){
    array[i] = [0,0];
};
array[1][0] = 1;
console.log(array);// [[0,0],[1,0],[0,0]]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容