基本概念
參照阮一峰老師的說(shuō)法
數(shù)組是按次序排列的一組值顾瞻。每個(gè)值的位置都有編號(hào)(從0開(kāi)始)膊存,整個(gè)數(shù)組用方括號(hào)表示判哥。
js中的數(shù)組
js中的數(shù)組其實(shí)并不是標(biāo)準(zhǔn)意義上的數(shù)組遥倦,其實(shí)是一種特殊的hash表
谤绳,原型鏈中有Array.prototype
。由于js中的數(shù)組數(shù)據(jù)在內(nèi)存中并不是連續(xù)的袒哥,所以很容易對(duì)數(shù)組進(jìn)行刪除缩筛,新增,修改等操作堡称。
//下面這種寫(xiě)法瞎抛,等同于于一個(gè)js數(shù)組
var arr = {
'0':1,
'1':2,
'2':3,
'length':3
}
arr.__proto__ = Array.prototype;
數(shù)組的聲明
-
var arr = Array(3)
聲明一個(gè)數(shù)組長(zhǎng)度為3的數(shù)組 -
var arr = Array(1,2,3)
聲明一個(gè)值為1,2,3的數(shù)組,即[1,2,3] -
var arr = new Array(3)
聲明一個(gè)數(shù)組長(zhǎng)度為3的數(shù)組 -
var arr = new Array(1,2,3)
聲明一個(gè)值為1,2,3的數(shù)組却紧,即[1,2,3] -
var arr = [1,2,3]
聲明一個(gè)數(shù)組[1,2,3]
通過(guò)以上代碼了解到桐臊,加不加關(guān)鍵字new
對(duì)聲明數(shù)組無(wú)影響钞艇。
由于Array
方法存在很強(qiáng)的不一致性,一般不用這種方式豪硅,常規(guī)的方式是最后一種聲明方式。
常用的api
Array.prototype
提供了許多api
挺物,其中常見(jiàn)的有:
-
Array.prototype.concat()
連接兩個(gè)數(shù)組 -
Array.prototype.slice()
獲取子數(shù)組 -
Array.prototype.sort()
對(duì)數(shù)組排序(注意:此方法會(huì)改變?cè)瓟?shù)組懒浮,因?yàn)閟ort內(nèi)部使用的是快排,屬于原地排序方法) -
Array.prototype.push()
在數(shù)組尾部添加數(shù)據(jù) -
Array.prototype.pop()
彈出數(shù)組尾部數(shù)據(jù) -
Array.prototype.shift()
彈出數(shù)組第一個(gè)數(shù)據(jù) -
Array.prototype.unshift()
在數(shù)組開(kāi)頭位置添加一個(gè)數(shù)據(jù) -
Array.prototype.splice()
刪除數(shù)組中的數(shù)據(jù) -
Array.prototype.join()
連接數(shù)組中的所有數(shù)據(jù)识藤,并且放回組成的字符串 -
Array.prototype.indexOf()
返回與值匹配的數(shù)組的下標(biāo)砚著,若沒(méi)有返回-1 -
Array.prototype.forEach()
遍歷數(shù)組,無(wú)返回值 -
Array.prototype.map()
遍歷數(shù)組痴昧,有返回值 -
Array.prototype.filter()
過(guò)濾數(shù)組元素 -
Array.prototype.reduce()
對(duì)數(shù)組中的每個(gè)元素應(yīng)用一個(gè)函數(shù)稽穆,將其減少為單個(gè)值
以下重點(diǎn)介紹一下sort
,forEach
,map
,filter
,reduce
,join
Array.prototype.sort() 排序
sort
方法接收一個(gè)函數(shù)參數(shù),函數(shù)接兩個(gè)參數(shù)赶撰,代表當(dāng)前值與下一個(gè)值舌镶,若返回一個(gè)正數(shù),交換兩個(gè)數(shù)的位置豪娜,否則不變餐胀。示例:
var arr = [3,2,1,4,5]
arr.sort(function(a,b){ //a當(dāng)前值,b下一個(gè)值
return a-b;
}) // [1,2,3,4,5]
Array.prototype.forEach 遍歷數(shù)組
forEach
方法接收一個(gè)函數(shù)為參數(shù)瘤载,函數(shù)接收三個(gè)參數(shù)(value,index,arr),一般只用到前面兩個(gè)參數(shù)否灾,無(wú)返回值。示例:
var arr = [3,2,1,4,5]
var res = arr.forEach(function(value,index){
console.log(value,index);
return value*value;
})
//3 0
//2 1
//3 2
//4 3
//5 4
console.log(res) //undefined
Array.prototype.map 遍歷數(shù)組鸣奔,返回每次返回值所組成的數(shù)組
map
方法與forEach
方法基本一致墨技,只是有一個(gè)返回值的差別。示例:
var arr = [3,2,1,4,5]
var res = arr.map(function(value,index){
console.log(value,index);
return value*value;
})
//3 0
//2 1
//3 2
//4 3
//5 4
console.log(res) //[9, 4, 1, 16, 25]
Array.prototype.filter 過(guò)濾器
filter
方法用于過(guò)濾數(shù)據(jù)挎狸,接收一個(gè)函數(shù)參數(shù)扣汪,函數(shù)接收三個(gè)參數(shù)(value,index,array),若返回值為true伟叛,把value添加到返回?cái)?shù)組中私痹。示例:
var arr = [3,2,1,4,5]
var res = arr.filter(function(value){
return value%2===0;
})
console.log(res) //[2,4]
Array.prototype.reduce 縮減,壓縮
reduce
方法對(duì)數(shù)組中的每個(gè)元素(從左到右)應(yīng)用一個(gè)函數(shù)统刮,將其減少為單個(gè)值紊遵。接收兩個(gè)參數(shù),第一個(gè)參數(shù)是函數(shù)侥蒙,第二個(gè)是起始值(可省略)暗膜。函數(shù)可接受四個(gè)參數(shù),一般情況下只用前面兩個(gè)(累計(jì)值鞭衩,當(dāng)前值)学搜,若省略第二個(gè)參數(shù)娃善,則函數(shù)累計(jì)值從下標(biāo)0開(kāi)始。示例:
//reduce實(shí)現(xiàn)累加
var arr = [3,2,1,4,5]
var res = arr.reduce(function(a,b){
return a+b;
}瑞佩,0)
console.log(res) //15
//求最大值
var max = arr.reduce(function(a,b){
return a>b?a:b;
})
console.log(max) //5
Array.prototype.join 連接數(shù)據(jù)聚磺,返回字符串
join
方法可以將數(shù)組轉(zhuǎn)換成字符串,中間用給定的連接符炬丸,默認(rèn)連接符是,
瘫寝。示例:
var arr = [3,2,1,4,5]
console.log(arr.join('-')) //3-2-1-4-5
Array.prototype.slice 獲取子數(shù)組
slice
方法接收兩個(gè)參數(shù)(起始位置,結(jié)束位置的后一個(gè)位置)稠炬,默認(rèn)從0開(kāi)始焕阿。返回子數(shù)組。示例:
var arr = [3,2,1,4,5]
var sub1 = arr.slice(); //[3,2,1,4,5]
var sub2 = arr.slice(1,2); //[2]
偽數(shù)組
關(guān)于js中的偽數(shù)組首启,常見(jiàn)的有NodeList
類(lèi)型和arguments
暮屡。所謂的偽數(shù)組就是可以通過(guò)下標(biāo)
取值和獲取length
的值,但是并不可以使用數(shù)組中的api
毅桃,即原型鏈中沒(méi)有Array.prototype
褒纲。一般情況,為了使用數(shù)組的的api
需要把偽數(shù)組轉(zhuǎn)為數(shù)組钥飞,一般使用slice
將偽數(shù)組轉(zhuǎn)為數(shù)組外厂。例如:Array.prototype.slice.call(arguments)
總結(jié)
本文簡(jiǎn)單介紹了數(shù)組的常見(jiàn)api
,并沒(méi)有很詳細(xì)的列舉所有的api
。也當(dāng)做學(xué)習(xí)筆記來(lái)使用代承,僅供學(xué)習(xí)與交流汁蝶。轉(zhuǎn)載請(qǐng)注明出處。