forEach究竟能不能改變陣列的值

2021-10-23 11:19:04 字數 1675 閱讀 9915

初學者每次提到array物件的時候有些煩人,有些方法是改變原陣列的,有些則不改變原陣列。 有趣的存在~foreach這個方法,或者說陣列儲存的資料本身 看兩個例子:

例子一:

let obj =

let oldarr =

['1',1

,obj,

true

] oldarr.

foreach

((el)

=>

) console.

log(oldarr)

從例子一來看foreach並不改變原陣列

例子二:

let obj =

let oldarr =

['1',1

,obj,

true

] oldarr.

foreach

((el)

=>

el =2}

) console.

log(oldarr)

例子二里的obj的值是被改變了的,那麼foreach究竟改不改變原陣列呢?

所以我們回到概念,foreach方法只是運算元據而已,陣列裡的資料是如何引用的呢?

js的資料有基本資料型別和引用資料型別,同時引出堆記憶體和棧記憶體的概念。

對於基本資料型別:number、string 、boolean、null和undefined,它們在棧記憶體中直接儲存變數名和值。

而object物件的真實資料儲存在堆記憶體中,它在棧記憶體中儲存的是變數名和堆記憶體的位置。

而在foreach方法裡操作了obj物件,實際操作的是物件本身,而資料只是引用了物件的棧記憶體位址,所以陣列裡的資料相應改變。

那麼為什麼foreach方法不能改變陣列裡的基本變數呢?

let a =

1let obj =

let oldarr =

['1',1

,obj,

true

,a] oldarr.

foreach

((el)

=>

el =2}

) a =

2 console.

log(oldarr)

不僅foreach方法無法改變,直接在外面操作a變數也無法改變。 因為陣列內的基本變數,在棧記憶體內生成了自己的值,並非引用棧記憶體的位址。

let a =

1let obj =

let oldarr =

['1',1

,obj,

true

,a] oldarr.

foreach

((el,index)

=>

oldarr[index]=2

})console.

log(oldarr)

神奇的事發生了,基本資料型別也被改變了。 因為我們使用foreach方法的時候對於每個資料都建立了乙個變數el,我們操作的是el變數,對於基本資料型別,el變數就是新建立的乙個記憶體。el變數改變並不影響基本原來位址值的改變。而el變數對應的是引用資料型別時,實際還是乙個引用位址,操作它,仍舊操作的是對應的堆記憶體。

總結:foreach方法裡操作物件生效,想要操作裡面的基本資料型別,就用arr[i]的形式直接運算元組。

能不能,不再只是競賽?

其實作為一名蒟蒻應該是沒有資格來說這個的,而下午看了一系列的文章之後,我還是憋不住來寫這篇東西。感謝自家老媽,把這篇文章發到了我的手機上 一開始看到,我也是驚了一下,歐美已經開始工業革命4.0了?粗略一翻,看到一句話,這次不帶上中國,更是驚了一下。我想每個oier踏上這條路,並且堅持下去都會有乙個說...

測試能不能發文章

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦測試一下能不能使用 markdown和擴充套件markdown簡潔的語法 塊高亮 latex數學公式 uml序列圖和流程圖 離線寫部落格 匯入匯出markdown檔案 豐富的快捷鍵 markdown 是一種輕量...

試試能不能獲取積分

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...