解決JS使用fill()進行數組填充遇到的問題
前言:
最近在做算法題時,遇到需要創(chuàng)建二維數組并進行初始化的情況,剛開始我使用的是 new Array(n).fill(new Array(n).fill('.')) 進行二維數組的初始化,但無論怎樣我都通不過測試用例。這讓我十分納悶,無奈之下,只能對照著標準代碼一句一句排查,終于讓我找到了罪魁禍首:Array(n).fill(new Array(n).fill('.'))。我將Array(n).fill(new Array(n).fill('.'))改成new Array(n).fill(0).map(\_ => new Array(n).fill('.'))之后,用例通過了。
接下來,我們便通過這兩句代碼來將 js 中的 fill()方法重學一下,避免下次再出現(xiàn)類似的問題。
兩句代碼之間的區(qū)別
相同點 以上兩句代碼目的都是創(chuàng)建一個 n x n 的二維數組,但是它們的方式和結果是不同的。
不同點
let board = new Array(n).fill(new Array(n).fill('.'));這段代碼在填充數組時,使用了同一個
數組實例(通過 new Array(n).fill('.')創(chuàng)建)。這會創(chuàng)建一個數組,其中每個元素都指向同一個數組(也就是說,如果你修改其中一個數組,所有數組都會被修改)。這是因為在 JavaScript 中,對象(包括數組)是通過引用傳遞的。const board2: string[][] = new Array(n).fill(0).map(\_ => new Array(n).fill('.'));
這段代碼通過.map()函數創(chuàng)建了 n 個新的數組實例。這意味著每個子數組都是獨立的,修改其中一個并不會影響其他的。這是因為.map()函數會對數組的每個元素執(zhí)行回調函數,而回調函數中又創(chuàng)建了一個新的數組。
因此,盡管這兩段代碼看起來都創(chuàng)建了 n x n 的二維數組,但是他們在數組的引用和修改上有很大的不同。
為什么會造成這樣的結果呢?
首先 我們先來自己大概實現(xiàn)下 fill 方法:
Array.prototype.fill = function(value, start = 0, end = this.length) {
// Handle negative values for start
if (start < 0) {
start += this.length;
if (start < 0) start = 0;
}
// Handle negative values for end
if (end < 0) {
end += this.length;
}
// Ensure start is not greater than end
if (start > end) {
[start, end] = [end, start];
}
// Fill the array
for (let i = start; i < end; i++) {
this[i] = value;
}
return this;
};可以看到 fill 方法中是直接將 value 的值給每一項,并且會改變原數組的值。
注意: 這個實現(xiàn)并沒有處理一些邊緣情況和錯誤檢查,所以它并不是一個完全準確的實現(xiàn)。真實的 Array.prototype.fill() 方法會更加復雜,因為它需要處理各種邊緣情況和錯誤條件。
因此當我們傳入一個引用類型時,數組中每一項都是對同一個對象的引用。這意味著如果你修改了一個元素,所有的元素都會受到影響。這個特性在使用 .fill() 方法填充數組時需要特別注意。
fill 方法其他需要注意的地方:
語法:
arr.fill(value ,[start],[end]) 參數:
- value:用來填充數組的值。
- start (可選):開始填充數組的索引。默認為 0。
- end (可選):停止填充數組的索引。默認為 arr.length。
- 返回值:被修改的數組,從 start 到 end 被 value 填充。
原地操作
fill() 是一個原地操作,這意味著它會直接修改原始數組,而不是創(chuàng)建一個新的數組。這與 JavaScript 中的許多其他數組方法(如 map() 或 filter())不同,后者會返回新數組并保持原始數組不變。
負索引
fill() 方法也接受負索引,它們從數組的末尾開始計算。例如,-1 指的是最后一個元素,-2 指的是倒數第二個元素,等等。如果你對 start 或 end 參數使用負索引,fill() 將從數組末尾開始或停止填充。
兼容性:
所有現(xiàn)代瀏覽器中都受支持,但在 Internet Explorer 中不受支持。如果你需要支持舊版瀏覽器,你可能需要使用polyfill 或者其他方式來實現(xiàn)相同的功能。
總結:
通過這兩句代碼,讓我獲益匪淺。雖然花了點時間去排查問題,但結果我還是很開心的。今天的分享就到此為止了,如有錯誤之處,歡迎大家留言指出,謝謝大家了。
到此這篇關于解決JS使用fill()進行數組填充遇到的問題的文章就介紹到這了,更多相關JS fill()數組填充內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
javascript SocialHistory 檢查訪問者是否訪問過某站點
今天delicious上這個名為 SocialHistory 的腳本十分引人注目。源代碼可以在這里下載。這段js代碼的功能就是判斷你的用戶有沒有訪問過某個網站。使用方法很簡單,例如:2008-08-08
Bootstrap 表單驗證formValidation 實現(xiàn)遠程驗證功能
這篇文章主要介紹了Bootstrap 表單驗證formValidation 實現(xiàn)遠程驗證功能,需要的朋友可以參考下2017-05-05
解決layui追加或者動態(tài)修改的表單元素“沒效果”的問題
今天小編就為大家分享一篇解決layui追加或者動態(tài)修改的表單元素“沒效果”的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09
JavaScript使用多線程實現(xiàn)一個大文件上傳
這篇文章主要為大家詳細介紹了JavaScript使用多線程實現(xiàn)一個大文件上傳的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2024-11-11
webpack4手動搭建Vue開發(fā)環(huán)境實現(xiàn)todoList項目的方法
這篇文章主要介紹了webpack4手動搭建Vue開發(fā)環(huán)境實現(xiàn)todoList項目的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05

