js array 删除指定元素_数组--学习笔记(数据结构数组 /js数组)
學習目標:
- 了解什么是數組;
- 數組如何訪問內存地址(一維,二維);
什么是數組
是由相同類型的元素的集合所組成的數據結構,分配一塊連續的內存來存儲。利用元素的索引可以計算出該元素對應的存儲地址。 最簡單的數據結構類型是一維數組。
數組如何實現隨機訪問?
數組是一種線性表數據結構,用一直連續的內存空間來儲存一組具有相同類型的數據。
根據數組的特性(連續存儲內存空間并且是線性表),才使用數組具有隨機訪問的特性。
缺點:
- 為了保持數組在內存中的連續性,使得數組插入或者刪除一個數據都需要做大量的搬移工作。
數組如何根據下標實現隨機訪問性?
計算機會給每個內存單元分配一個地址,計算機通過地址來訪問內存中的數據。當計算機需要隨機訪問數組中的元素時,會通過下面的尋址公式來計算該元素在內存中存儲的內存地址。
a[i]_address=base_address+i*data_type_size;其中data_type_size表示數組中每個元素的大小,比如儲存的是int類型,那么data_type_size為4個字節。
數組要從0開始編號,而不是從1開始呢?
從數組儲存的內存模型上來看,“下標”最確切的定義應該是“偏移 offset”。
如果數組從1開始計數,那么內存地址公式變成
a[i]_address=base_address+(i-1)*data_type_size;不難發現需要多計算一個減法運算,對于CPU來說,就多了一條減法指令。
jvm標記清除垃圾回收算法:先記錄數據需要被刪除的數據(數組刪除會引發數據搬移的工作,因為數組需要保持它的連續性),當數組沒有更多空間存儲數據時,再觸發一次真正的刪除操作。
JavaScript數組的特點:
JavaScript的數組,在相同類型條件下,大小沒有超過它設定的是按照數據結構中的數組設置的,如果超過設置的內存或者存放不同數據類型都是使用Hash Table (Map)存儲的。
- 支持存放不同類型數據;
有大小現在 length最大值為232 -1 --> Ecmascript 262;
v8引擎如何實現數組的?
- js數組長度是動態的,創建的時候無需聲明一個固定的長度(可可以指定)。
- js數組可能是數組索引不連續的稀疏數組。
- 數用組length表示數組的長度;
- 對于稀疏數組,表示元素的個數。
- 同一個數組中可以是相同類型的元素,也可以是不相同類型的元素;
V8對數組分Fast Elements 和Dirctionary Elements兩種存儲方式進行儲存。
Fast Elemeents: 傳統的線性存儲方式;
Fast Holey Elements: 空洞模式(存在未給元素賦值的情況--undefined);
Dirctionary Elements:Hash表存儲;
length超過1024的時候轉Dirctionary模式;
避免模式轉換,也避免空洞模式。
數組其他事項:
- If length > 232 - 1, throw a RangeError exception;
- If length is -0, set length to +0;
- 數組的length屬性描述符 { [[Value]]: length, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })。
- 數組的屬性描述符 [[Extensible]] to true.
js的數組方法
- 數組的創建
//字面量 let arr=[1,3,5]; //構造函數 let arr1=new Array(1,3,5); let arr2=Array(1,3,5); Array() 和 new Array()效果一樣,一個參數都是代碼數組的長度,大于等于2個參數,都是代表創建數組對應的元素。
- 數組的存取方法 indexOf() / join(),toString()/concat(),splice() :
- indexOf()根據值返回值所對應的下標;
- join(),toString() 數組轉字符串;
- concat()合并多個數組來形成新數組,不影響原來的數組。
合并數組,如果數組是非一維數組(比如二維、三維數組),不會將它們扁平化。
let arr=new Array(8);
let arr4=[[1,2]];console.log(arr1.concat(arr4,[5,6,7]));//[ 1, 2, 3, [ 1, 2 ], 5, 6, 7 ]- splice() 截取一個數組的子集作為一個新數組,影響原來的數組;
- 語法splice(start[, deleteCount[, item1[, item2[, ...]]]]) --- [三個參數 start/ deleteCount / item1,item2 ];
- start為非負數的情況
- start>=length,不會刪除數組的任何元素;
- start為非正數的情況
- 如果start+array.length >= 0 從后開始數;
- 如果start+array.length < 0 從0開始數;
- 第三個參數如果不加,則表示從數組中刪除元素,如果添加第三個參數,表示從數組中添加元素;
- 可變函數 push(), unshift(), pop(), shift()
let arr=[1,2,3,4];
arr.push(5,6,7);//[1,2,3,4,5,6,7] 數組的末尾添加元素//數組的頭添加元素 arr.unshift(5,6,7);//[5,6,7,1,2,3,4] //此方法無參數
arr.pop();// 數組尾刪除一個元素
arr.shift();//數組頭刪除一個元素- 迭代器方法
- 返回新數組 map() / filter();
- 不返回新數組 forEarch() 、every()、some()、reduce().
forEarch() 返回值undefined, 不改變原來的數組。
every()返回值為boolean值, 不改變原來的數組。每個元素都為true,才返回true。
some()返回值為boolean值, 不改變原來的數組。只有有元素為true,就返回true。
reduce()可以用來字符串拼接,求和等。
- 二維數組
arr=[[1,2,3],[4,5,6]]; console.log(arr[1][0]); //第一個下標代表行 第二個下標代表列
參考文獻:
ChromeV8引擎中Javascript數組實現分析與性能優化.pdf?max.book118.comArrayCreate?www.ecma-international.org如果您覺得get到時了新知識 請我喝杯咖啡吧
wxp://f2f0ZCPViuTt3GtyInH_XBo9dMG-9J3wzdBh (二維碼自動識別)
https://qr.alipay.com/fkx13050fxko05jvyheaz93 (二維碼自動識別)
總結
以上是生活随笔為你收集整理的js array 删除指定元素_数组--学习笔记(数据结构数组 /js数组)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python怎么发送代码文件_pytho
- 下一篇: jpa分页查询_spring data