初學者每次提到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...