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