了解數(shù)組之前,我們先了解下計算機是如何存儲數(shù)據(jù)的。
在計算機里面,數(shù)據(jù)是存儲在一個個小盒子里面的,而每個小盒子都有自己的地址。當(dāng)我們要訪問某個數(shù)據(jù)的時候,就要去訪問存儲該數(shù)據(jù)的盒子。
數(shù)組相對于單個數(shù)據(jù),就比較特殊一點。它是連續(xù)的一組內(nèi)存空間(盒子),存儲具有相同類型的數(shù)據(jù)。
那么在javascript里面,我們是怎樣初始化數(shù)組的呢?
//第一種
var array1=[];
//第二種,直接放入數(shù)據(jù)
var array2=[1,2,3,4,5,6];
//第三種
var array3=new Array();
//第四種,直接放入數(shù)據(jù)
var array4=new Array(1,2,3);
//第五種,申請了三個盒子來存儲數(shù)據(jù)
var array5=new Array(3);
在上面的五種方法中,第一和第二的效率最高。
你可能會有疑問,申請數(shù)組的時候,是不是必須要告訴計算機,我們需要多少個盒子?
答案很明顯,不是必須的。但是你要清楚,雖然你不設(shè)置盒子的數(shù)量(數(shù)組的大小),但是實際上計算機早就幫你申請了固定數(shù)量的盒子。
那盒子不夠了怎么辦?
小明和他的兩個朋友去ktv唱歌,因為人少,他們預(yù)約了一個小包間。突然小明的電話響了,原來他的另外四個朋友聽說他來唱歌了,嚷嚷著也要來。
這個時候,小明想,現(xiàn)在的包間肯定小了,他趕緊去找經(jīng)理換了個大一點的包間。
因為數(shù)組的連續(xù)性,要讓盒子的數(shù)量變多,只能丟掉當(dāng)前的盒子,重新尋找更多的連續(xù)的盒子。
數(shù)組的連續(xù)性,導(dǎo)致每次擴充容量的時候,都要耗費大量的時間,重新尋找連續(xù)的盒子,而且有時候計算機提供不了那么多連續(xù)的盒子。
那我們?yōu)槭裁催€是要用數(shù)組來存儲數(shù)據(jù)呢?
數(shù)組支持隨機訪問,因為每個盒子都有地址,就像我們房子的門牌號。
假設(shè)我們數(shù)組的第一個元素門牌號是21001,那么我們要訪問第十個元素,我們直接去找門牌號是21010的盒子,而不是一個一個去找,這么做大大節(jié)省了我們的時間。
讀取數(shù)組中元素的時候,要注意:數(shù)組的下標(biāo)(中括號里面的數(shù)字)是以0為開始的,也就是說a[1]是數(shù)組a的第二號元素。因為數(shù)組下標(biāo)是指相對第一個元素的“偏移“。另外,訪問數(shù)組的時候,一定要注意不要越界(數(shù)組里總共有十個元素,但是你非要訪問第十一個元素),如果越界可能會導(dǎo)致系統(tǒng)崩潰。
// 數(shù)組的讀取
var array=[1,2,3,4,5];
console.log(array[3]); //該函數(shù)是將數(shù)據(jù)打印到控制臺
數(shù)組有了,接下來我們就要對它進行操作了。
//數(shù)組的遍歷
var array1=[1,2,3,4,5,6];
for(var i=0;i<array.length;i++)
{
console.log(array[i]);
}
//數(shù)組和字符串的轉(zhuǎn)換
//字符串轉(zhuǎn)數(shù)組,以空格為標(biāo)準(zhǔn),拆分字符串
var data1="Bob is a good boy";
var array2=data1.split(" ");
// 數(shù)組轉(zhuǎn)字符串
var array3=[1,2,5,8,9];
var data2=array3.toString();
var data3=array3.join("-"); //拼接成的字符串以-隔開
那我們怎么判斷一個變量是數(shù)組呢?
var array1=[1,2,3,4,5,6];
var result=Array.isArray(array1);
有時候我們想要復(fù)制數(shù)組,很簡單的做法就是將就舊數(shù)組直接賦值給新數(shù)組。
var array1=[1,2,5,6,8,9,11];
var array2=array1;
但是這樣做有個問題,將舊數(shù)組賦值給新數(shù)組,只是相當(dāng)于給舊數(shù)組增加了一個新的引用,修改原來的引用,新引用也會感知到其中的變化,這種復(fù)制被稱作淺復(fù)制。(修改array1,array2也會改變)
那么怎么樣才能做到修改其中一個,另外一個不發(fā)生變化(深復(fù)制)?
var array1=[1,2,5,6,8,9,11];
var array2=[];
//array1.length是指數(shù)組的長度
for(var i=0;i<array1.length;i++)
{
array2[i]=array1[i];
}
查找數(shù)組中的元素,有兩種情況:(1)已知該元素是數(shù)組中的第幾個,求該元素的數(shù)值,這種直接按照之前說的隨機訪問方式尋找。(2)已知元素的值,求該元素在數(shù)組中的位置。
若數(shù)組中包含多個相同的元素,則indexOf方法返回第一個與參數(shù)相同的索引值,而lastIndexOf方法返回最后一個與參數(shù)相同的索引值,
var array1=[1,2,5,6,8,9,11,2,5,1];
//indexOf方法
var num1=array1.indexOf(2);
// lastIndexOf方法
var num2=array1.lastIndexOf(5);
console.log(num1);
console.log(num2);
其實我們可以通過已知數(shù)組去創(chuàng)建數(shù)組。
(1) 兩個 數(shù)組 合并成一個新數(shù)組;
(2) 在某個數(shù)組中截取一段為新數(shù)組;
//數(shù)組合并
var array1=[1,2,3,4,5,6,7];
var array2=[3,4,6,7,9,11,12];
var array3=array1.concat(array2);
console.log(array3);
//數(shù)組截取
var array4=[1,2,3,4,5,6,7,8,9];
//splice函數(shù)返回截取之前的數(shù)組片段,
//第一個參數(shù)是截取的起始位置,第二個參數(shù)是截取長度。
var array5=array4.splice(2,6);
console.log(array5);
有時候當(dāng)我們創(chuàng)建數(shù)組的時候,并不知道數(shù)組里面應(yīng)該填充什么數(shù)據(jù),我們需要根據(jù)程序動態(tài)的添加元素。
var array=[];
// 數(shù)組開頭添加元素
array.unshift(12);
//數(shù)組最后一個元素之后添加元素
array.push(24);
但是有時候我們也需要動態(tài)去刪除元素
var array1=[1,2,3,4,5,6];
// 刪除數(shù)組最后一個元素
array1.pop();
//刪除數(shù)組第一個元素
array1.shift();
當(dāng)刪除數(shù)組中的元素時,被刪除元素后面的數(shù)據(jù),要整體向前移動。(因為數(shù)組的連續(xù)性)
每次我們刪除數(shù)據(jù),我們需要耗費比較多的時間去整理數(shù)組。
但是在某些情況下,我們不一定要追求數(shù)組的連續(xù)性,我們可以將多次刪除操作集中在一起執(zhí)行。
java中的垃圾回收,就是這種原理。
在這里我們主要了解一下,垃圾的標(biāo)記清除算法。它分為兩個階段,第一階段是標(biāo)記,虛擬機會遍歷所有的數(shù)據(jù),找到存活的對象進行標(biāo)記(大多數(shù)主流的虛擬機采用可達性分析算法來判斷對象是否存活),標(biāo)記工作完成之后,將不存活的數(shù)據(jù)進行清理。
不過此方法的不足在于:(1)標(biāo)記清除過程效率不高,只有少量垃圾產(chǎn)生時會很高效。(2)會產(chǎn)生不連續(xù)的內(nèi)存空間碎片。
其實還要很多更高效的垃圾回收算法,如果感興趣,可以點擊下面的文章繼續(xù)了解。JVM 垃圾回收算法
有時候我們要涉及一些數(shù)組的排序
var array1=[1,3,4,6,8,3,2,1,4,5,8];
// 數(shù)組的翻轉(zhuǎn),也就是從尾部到頭部倒序排列
var array2=array1.reverse();
console.log(array2);
//數(shù)組的排序,按照從小到大的順序排列
var array3=["a","c","d","em","1","4","9"];
var array4=array3.sort();
console.log(array4);
需要注意的是數(shù)組的排序方法,默認(rèn)是按照字典的順序?qū)υ剡M行排序的,所有對于元素是數(shù)字的數(shù)組排序,sort函數(shù)并不準(zhǔn)確。
那么我們怎樣才能準(zhǔn)確的處理數(shù)字?jǐn)?shù)組的排序呢?我們需要傳入一個函數(shù)。
var array1=[1,3,4,16,28,3,2,1,4,5,8];
var array2=array1.sort(sort_data);
console.log(array2);
function sort_data(num1,num2)
{
return num1-num2;
}