@(javascript)[js數(shù)組]
[toc]
JS數(shù)組
數(shù)組也是一種數(shù)據(jù)類型,用于存放數(shù)據(jù)。在各大語言中都存在數(shù)組,但是語法由于大同小異。在JavaScript中數(shù)組也是一個非常重要的東西,所以有必要好好的了解一下。
創(chuàng)建一個數(shù)組
在JavaScript中數(shù)組是一中數(shù)據(jù)格式,不是一種數(shù)據(jù)類型。
我們可以使用構(gòu)造函數(shù)與字面量兩種方式創(chuàng)建一個數(shù)組。
構(gòu)造函數(shù):
var arr = new Array()
console.log(arr) // []
我看可以在創(chuàng)建的時候傳遞參數(shù):
var arr = new Array(10)
console.log(arr) // (10) [empty × 10]
var arr = new Array(-10)
console.log(arr) // Uncaught RangeError: Invalid array length
var arr = new Array(10,10)
console.log(arr) // (2) [10, 10]
var arr = new Array("10")
console.log(arr) // ["10"]
可以看出,參數(shù)如果是
- 一個number,數(shù)組就是一個長度為number的數(shù)組,里面的每一項都為空,不支持負(fù)數(shù)(取值范圍出錯)
- 其他情況,就是數(shù)組的每一項,幾個參數(shù)就是長度為幾的數(shù)組
也可以使用字面量的方式創(chuàng)建一個新數(shù)組。
字面量:
var arr = [];
console.log(arr) // []
var arr = [10]
console.log(arr) // [10]
var arr = [10,10]
console.log(arr) // [10, 10]
var arr = ["10"]
console.log(arr) // ["10"]
與使用構(gòu)造函數(shù)不同的是,使用字面量是無法一下創(chuàng)建一個長度為n的數(shù)組的,如果是要創(chuàng)建一個長度為10的數(shù)組,可以直接修改數(shù)組的長度。數(shù)組的長度是可讀可寫的。
var arr = [];
console.log(arr.length) // 0
arr.length = 10;
console.log(arr.length) // 10
console.log(arr) // (10) [empty × 10]
如果修改長度后數(shù)組的長度大于原來的長度,那么多出來的這幾項為空(empty,一些瀏覽器顯示為undefined)。若果是小于原來數(shù)組的長度,那么就是從數(shù)組的末尾刪除這個差值的項數(shù)。
也可以直接使用數(shù)組的下標(biāo)添加或者是修改數(shù)組
var arr = [0,1,2];
arr[1] = "1";
arr[5] = "5";
console.log(arr) // (6) [0, "1", 2, empty × 2, "5"]
如果數(shù)組中原來就存放了這一下那么就是修改,arr[1] = "1"。否則就是添加這一項arr[5] = "5"。中間多出來的顯示一個empty。
數(shù)組的方法
數(shù)組的方法是非常多的。
添加與刪除
- push
- pop
- shift
- unshift
push與unshift
push與unshift方法都是添加數(shù)組。push是往數(shù)組后面添加一項,unshift是往數(shù)組前面添加一項。
var arr = [1,2,3]
var res = arr.push(4)
console.log(arr) // (4) [1, 2, 3, 4]
console.log(res) // 4
var res = arr.unshift(4)
console.log(arr) // (5) [4, 1, 2, 3, 4]
console.log(res) // 5
兩個方法都接受至少0個參數(shù)。
兩個方法都是返回的新數(shù)組的長度。
pop與shift
pop與shift都是刪除數(shù)組某一項的方法。pop是刪除數(shù)組的這最后一項,shift是刪除數(shù)組的第一項。分別與push與unshift方法對應(yīng)。
var arr = [1,2,3]
var res = arr.pop()
console.log(arr) // (2) [1, 2]
console.log(res) // 3
var res = arr.shift()
console.log(arr) // [2]
console.log(res) // 1
兩個方法都不需要參數(shù)
兩個方法都是返回的刪除的這一項。
數(shù)組排序
- reverse
- sort
reverse反轉(zhuǎn)數(shù)組
var arr = [3,5,1,6,4,7];
console.log(arr.reverse()) // (6) [7, 4, 6, 1, 5, 3]
很簡單,就是把數(shù)組倒序了。
sort數(shù)組排序
var arr = [3,5,1,6,4,7];
console.log(arr.sort()) // (6) [1, 3, 4, 5, 6, 7]
如果只是一位數(shù)字沒有問題,但是如果是多為數(shù)字就有問題。
var arr = [22,3,556,1,32,11,2]
console.log(arr.sort()) // (7) [1, 11, 2, 22, 3, 32, 556]
因為sort()方法會根據(jù)測試字符串的結(jié)果來改變順序比較2與11的時候比較的是字符串"2"與"11"。所以出現(xiàn)上面的結(jié)果。
sort方法可以接受一個函數(shù)作為參數(shù),自己規(guī)定排序問題。
var arr = [22,3,556,1,32,11,2]
console.log(arr.sort(function(a,b){
return a - b;
})) // (7) [1, 2, 3, 11, 22, 32, 556]
參數(shù)函數(shù)接收兩個參數(shù),第一個參數(shù)因該位于第二個前面放回負(fù)數(shù),位于之后返回正數(shù),否則返回0。
數(shù)組拼接concat
concat 方法及拼接數(shù)組。在不改變原數(shù)組的情況下把多個數(shù)組拼接返回新數(shù)組。
var arr = [1,2];
var res = arr.concat([2,3])
console.log(arr) // (2) [1, 2]
console.log(res) // (4) [1, 2, 2, 3]
數(shù)組切割slice
slice方法可以把數(shù)組切割
var arr = [1,2,3,4,5]
console.log(arr.slice(1)) // (4) [2, 3, 4, 5]
console.log(arr.slice(1,3)) // (4) [2, 3]
console.log(arr) // (5) [1, 2, 3, 4, 5]
slice接收兩個參數(shù),第一個是切割的開始位置。第二個可選,表示切割的結(jié)束位置(不包含這個索引對應(yīng)的值),如果沒有第二個參數(shù),表示末尾。
如果slice中存在負(fù)數(shù),則是倒數(shù)的。如果是slice(-1,3)則相當(dāng)于是slice(4,3)。那么返回的是一個空數(shù)組。
數(shù)組的splice方法
splice是一個非常強大的方法,之前除了排序其他的方法都可以使用splice實現(xiàn)。這個方法自身可以接收>=2個參數(shù)。
兩個參數(shù)為刪除:
var arr = [1,2,3,4];
var res = arr.splice(1,2);
console.log(arr) // [1,4]
console.log(res) // [2,3]
第一個參數(shù)是刪除的開始位置,第二個刪除的項數(shù)。上面的表示第下標(biāo)為1開始刪除兩項。
返回的是刪除的內(nèi)容。
三個參數(shù)是插入:
var arr = [1,2,3,4];
var res = arr.splice(1,0,3,5);
console.log(arr) // (6) [1, 3, 5, 2, 3, 4]
console.log(res) // (2) []
第三個及以后參數(shù)表示的是需要插入的項。
這樣就可以實現(xiàn)替換的效果了。
var arr = [1,2,3,4];
var res = arr.splice(1,1,3,5);
console.log(arr) // (5) [1, 3, 5, 3, 4]
console.log(res) // (2) [2]
上面表示從第一項開始,刪除一項并且替換為后面的東西。
位置判斷indexOf與lastIndexOf
兩個方法都是查找,接收一個參數(shù),如果有返回查找的東西在數(shù)組中出現(xiàn)的下標(biāo)(位置)。沒有返回-1。indexOf是正向查找,lastIndexOf是反向查找。
var arr = [1,2,3,4,3,2,1]
console.log(arr.indexOf(3)) // 2
console.log(arr.indexOf(5)) // -1
console.log(arr.lastIndexOf(3)) // 4
console.log(arr.lastIndexOf(5)) // -1
數(shù)組的迭代方法
- every
- some
- filter
- forEach
- map
五個方法都可以接收兩個參數(shù)。第一個參數(shù)是一個函數(shù),第二個是第一個函數(shù)中的this的值,即:如果有第二個參數(shù),那么第一個參數(shù)中使用了this,這個this就表示第二個參數(shù)。
第一個參數(shù)函數(shù)可以接收三個參數(shù):
- 數(shù)組每一項的值
- 這一項在數(shù)組中的下標(biāo)
- 數(shù)組本身
every與some
兩個方法是判讀數(shù)組中每一項滿不滿足這個條件。every表示每一項都滿足返回true,否則返回false。some表示數(shù)組中有滿足的就返回true,否則false。
var arr = [1,2,3,4,5]
var res = arr.every(function(item,index){
return item > 2
})
console.log(res) // false
var res = arr.some(function(item,index){
return item > 2
})
console.log(res) // true