JS中陣列的一些筆記

2021-09-28 18:46:29 字數 1868 閱讀 8502

今天工作時碰到乙個需求,有兩個陣列arraychild, arrayfather, 要求:

1、往陣列arraychild中放入乙個元素;

2、將當前的陣列arraychild放入arrayfather中;

3、清空陣列arraychild,將乙個新元素放進去;

4、將放了新元素的arraychild放入陣列arrayfather中。

剛開始是這麼寫的:

const arraychild = ;

const arrayfather = ;

arraychild.push(0, 1);

arrayfather.push(arraychild);

arraychild.splice(0);

arraychild.push(3, 4);

arrayfather.push(arraychild);

console.log(`arrayfather = $`);

預想結果是:  

arrayfather = [[0, 1], [3, 4]];

實際結果:

arrayfather = [[3, 4], [3, 4]];

為什麼呢?向公司老司機請教,才知道原來建立乙個陣列時,會在記憶體中開闢一塊堆記憶體a,我的arraychild是在另一塊棧記憶體中存入了指向堆記憶體a的位址,所以使用const宣告的陣列,還可以繼續向陣列內新增東西。在第一步,arrayfather.push(arraychild),也是將arrayfather指向了arraychild指向的堆記憶體a,然後splice是清除arraychild中的資料,就是將堆記憶體a中的資料全部清除,所以這時arrayfather和arraychild都是空的。這時再往arraychild中新增新資料,那麼arrayfather = arraychild = [3, 4], 然後arrayfather又push了一次arraychild,所以最後arrayfather = [[3, 4], [3, 4]]

那想要實現需求怎麼辦呢?可以用這種方法:

let arraychild = ;

const arrayfather = ;

arraychild.push(0, 1);

arrayfather.push(arraychild);

arraychild = ;

arraychild.push(3, 4);

arrayfather.push(arraychild);

console.log(`arrayfather = $`);

預想結果是:  

arrayfather = [[0, 1], [3, 4]];

實際結果:

arrayfather = [[0, 1], [3, 4]];

這裡的arraychild = 就是重新開闢一片記憶體了,所以原來的值還會存在,相當於:

1、首先分配了一塊記憶體(陣列的值存放在堆中,索引存放在棧中),存了個陣列[0, 1],索引是arraychild

2、將arrayfather(前兩個位址指標)指向這塊堆記憶體

3、另外分配一塊新記憶體,存了陣列[3, 4],把索引arraychild重新指向這裡

4、將新記憶體的位址存入arrayfather(的arrayfather[2]和arrayfather[3])中,因為原先的arraychild的值還在被arrayfather引用,所以這塊記憶體不會被**,所以最終的目的達成。

綜上所述,問題的根源在於對陣列的本質不了解。新建陣列,就是新分配一塊堆記憶體存放陣列的值。堆記憶體的位址存放在一塊棧記憶體中,組成陣列的索引。

更多專業前端知識,請上

【猿2048】www.mk2048.com

JS陣列中的一些方法

let arr let arrjson 20,22,18,21 every 判斷陣列中每個元素都大於或小於乙個指定元素 let newarr arrjson.every item console.log newarr false 必須要全部滿足才會返回true sort 陣列排序 返回乙個新的陣列 ...

JS中的陣列(關於陣列的一些基本操作與一些騷操作)

本次筆記記錄一下個人關於陣列沒掌握好的一些知識點 arra.of用來建立單個陣列 當我們想建立陣列中只有乙個元素,且元素值為1的時候 let arr1 new array 1 console.log arr1 很顯然,列印出的卻是長度為1的空陣列 正確方法來了 let arr2 array.of 1...

一些js陣列操作

雖然很基礎,但是還是想總結一下,總有時候用到的時候想不起來需要文件幫助。1.sort 它會改變原來的陣列。操作例子 但是sort 又是常用的陣列操作,特別是一些管理系統當中,我說乙個實際專案中的例子,我做過乙個公告列表,後台給的列表的排序是置頂的排前,然後再是時間排序,然而我需要得到這個陣列中時間最...