數組Array是JavaScript中最常用的類型之一,同一數組中可以保存任意類型的數據,並且它的長度是動態的,會隨著數組中數據的加減自動變化。每個數組都有一個表示其長度(數組元素的個數)的length屬性。並且數組元素的索引(下標)是從0開始的,所以數組最後一個元素的索引永遠等於length – ...
數組Array是JavaScript中最常用的類型之一,同一數組中可以保存任意類型的數據,並且它的長度是動態的,會隨著數組中數據的加減自動變化。每個數組都有一個表示其長度(數組元素的個數)的length屬性。並且數組元素的索引(下標)是從0開始的,所以數組最後一個元素的索引永遠等於length – 1;
一 創建數組
1,使用new關鍵字創建
1 var arr = new Array();
可以向Array構造函數傳遞參數以實現創建包含特定數據的數組,多個參數使用逗號隔開。
需要註意的是:當參數只有一個數字時,構造函數創建的不是包含該數字的字元串,而是一個長度為該數字的空數組,即arr.length = 數字。
2,使用字面量形式創建
1 var arr = [1,2,3];
數組元素被包含在一對“[]”中括弧內,數組的每個元素之間用逗號隔開,最後一個元素後面不需要逗號。
另外,上面已經講過,數組的長度是動態的,它體現在可以手動的修改其length的值,以達到刪除或增加數組長度的目的。
1 var arr = [1,2,3]; 2 console.log(arr.length);//3 3 arr.length = 2; 4 console.log(arr.length);//2 5 console.log(arr);//[1,2] 6 arr.length = 3; 7 console.log(arr.length);//3 8 console.log(arr);//[1,2,empty ]
3,數組元素的訪問
我們使用中括弧[]加數字的形式訪問數組元素。
1 var arr = [1,2,3]; 2 console.log(arr[0]);//1
通過這種方式我們也可以動態的修改某一位置的值,或向某一位置插入一個新值。
1 var arr = [1,2,3]; 2 arr[0] = 4; 3 console.log(arr);//[4,2,3] 4 arr[4] = 0; 5 console.log(arr);//[4,2,3,empty,0];
可以看到,原本arr的長度是3,但我們向下標4的位置插入了一個新值,於是數組的長度變成了5,由於下標為3的位子原來並沒有值,並且我們也沒有新插入,所以JavaScript自動向該位置添加了一個空值占位符。
二 數組的遍歷
1,普通for迴圈
1 var arr = [1,2,3]; 2 for(var i = 0,len = arr.length;i < len;i++){ 3 console.log(arr[i]); 4 //some code; 5 }
效率最高的遍曆數組方式。
2,forEach
1 var arr= [1,2,3]; 2 arr.forEach(function (item, index, array) { 3 console.log(index + ":" + item + ":" + array); 4 }); 5 /* 6 0:1:[1,2,3] 7 1:2:[1,2,3] 8 2:3:[1,2,3] 9 */
函數接受3個參數,第一個是當前處理元素的值,第二個是當前處理元素的下標,第三個是當前遍歷的數組,第二三個參數是可選的。
3,map
1 var arr = [1,2,3]; 2 var newArr = arr.map(function (item, index, array) { 3 return item * item; 4 } 5 console.log(newArr);//[1,4,9]
函數的參數和forEach方法一致。它會把函數作用到每個遍歷到的數組元素上,並返回一個新值,最終得到一個新數組並返回。
4,for…in
1 var arr = [1,2,3]; 2 for(var index in arr){ 3 console.log(index + ":" + arr[index]); 4 } 5 /* 6 0:1 7 1:2 8 2:3 9 */
for...in更適合遍歷對象,而不是數組,而且使用它遍曆數組的效率並不高。
5,for…of
1 var arr = [1,2,3]; 2 for(var item of arr){ 3 console.log(item); 4 } 5 //1 6 //2 7 //3
for...of是ES6的新方法,用它遍曆數組比for...in稍快一點。
三 數組常用方法
1, toString(),valueOf()和join()
數組調用toString()和valueOf()一般返回由逗號隔開的所有數組元素組成字元串。
1 var arr = [“hello”,”world”]; 2 console.log(arr.toString());//”hello,world” 3 console.log(arr.valueOf());//”hello,world”
join()方法和他們不同,它可以接受一個字元串作為參數,用這個字元串作為分隔符。
1 var arr = [”hello”,”world”]; 2 console.log(arr.join());//”hello,join” 3 console.log(arr.join(“”));//”helloworld” 4 console.log(arr.join(“&&”));//”hello&&world”
2, push()和pop(),unshift()和shift()
push()接受任意個參數,依次添加到數組的末尾,返回修改後數組的長度。
pop()從數組末尾刪除一項,返回被刪除的元素。
unshift()從數組開頭插入任意個元素,返回插入後數組的長度。
shift()從數組開頭刪除一個元素,返回被刪除的元素。
1 var colors = ["red","blue","pink","white"]; 2 colors.push("black");//5 3 console.log(colors);//["red","blue","pink","white","black"] 4 colors.pop();//"black" 5 console.log(colors);//["red","blue","pink","white"] 6 colors.unshift("green");//5 7 console.log(colors);//["green","red","blue","pink","white"] 8 colors.shift();//"green" 9 console.log(colors);//["red","blue","pink","white"]
3, reverse()和sort()
reverse()會翻轉數組元素的順序。
1 var arr = [1,2,3]; 2 arr.reverse(); 3 console.log(arr);//[3,2,1]
sort()預設根據數組元素的字元編碼排序。可以接受一個函數作為參數,該函數接受兩個參數,如果第一個參數應該在第二個之後,那麼返回一個正數,如果第一個和第二個位置不變,則返回0,如果第一個應該在第二個之前,那麼返回一個負數。
1 var colors = ["red","blue","pink","white"]; 2 colors.sort(function(val1,val2){ 3 if(val1 < val2){ 4 return -1; 5 }else if(val1 == val2){ 6 return 0; 7 }else{ 8 return 1; 9 } 10 }); 11 console.log(colors);["blue","pink","red","white"]
如果想實現倒序排列,可以設置當val1小於val2時返回1,最後返回-1;如果比較的是數字,可簡寫為:
1 var arr = [3,51,55,23,-1,-50,0.2]; 2 arr.sort(function(val1,val2){ 3 return val1 - val2; 4 }); 5 console.log(arr);//[-50, -1, 0.2, 3, 23, 51, 55]
如果想實現倒序排列,則return val2 - val1 即可;
sort()方法在接受到函數作為參數後,會把數組的每一個值依次當做函數的參數傳給它,第一次是arr[0]和arr[1],比較完後會把排在後面的那個值作為函數的第一個參數,arr[2]作為第二個參數再傳給函數,依次類推,直到最後一個數組元素。
4, concat()
接受一個或多個數組作為參數,把這些參數數組與原數組連接,形成一個新數組並返回。如果不是數組,也會被簡單的連接到一起形成新數組。
1 var arr = [1,2,3]; 2 var otherArr = ["hello","world"]; 3 console.log(arr.concat(otherArr));//[1,2,3,"hello","world"]
5, slice()
接受兩個數字作為參數,返回數組下標在他們之間的元素(不包含下標為第二參數的元素)組成的新數組,該方法不會改變原數組。
1 var arr = [1,2,3,4,5]; 2 var newArr = arr.slice(0,4); 3 console.log(newArr);//[1,2,3,4]
6, splice()
該方法功能強大,有以下三種使用方法:
A:刪除
接受兩個數字參數,第一個表示需要被刪除的第一項的下標,第二個表示續保被刪除的元素個數。
B:插入
接受3個或多個參數,第一個是插入元素的起始位置,第二個是0,表示不刪除原數組的任何元素,第三個是要被插入的元素,如果有多個元素需要被插入,可以繼續在後面添加其他參數。
C:替換
接受3個或多個參數,第一個是要被替換的元素的起始位置,第二個是需要被替換的元素個數,其他的的參數是替換的內容。如果想保持原數組長度不變,則替換內容的個數必須和第二個參數相等。
var arr = [1,2,3,4,5]; arr.splice(0,3);//從第一個元素開始刪除3個元素 console.log(arr);//[4,5] arr.splice(0,0,1,2,3);//從第一個元素開始刪除0個,並添加1,2,3這3個元素 console.log(arr);[1,2,3,4,5] arr.splice(2,2,5,5);//從第三個元素開始刪除2個,併在該位置添加兩個5,從結果看就像是用5替換了原數組中的3和4 console.log(arr);//[1,2,5,5,5]
數組還有很多有用的方法,這裡只列舉了比較常用的一些方法,瞭解詳細請移步MDN的標準內置對象Array;