基本上每種編程語(yǔ)言中都存在數(shù)組這種數(shù)據(jù)類(lèi)型榆浓,而且地位都很重要。在JavaScript中數(shù)組更是編程的核心武器之一撕攒,對(duì)于數(shù)組的知識(shí)了解的越多越好陡鹃,越深入越好。
雖然我之前已經(jīng)寫(xiě)過(guò)很多關(guān)于數(shù)組的文章抖坪,比如JS-判斷變量是否為數(shù)組萍鲸,求探討:Java和JavaScript數(shù)組的性能
,JS-數(shù)組sort方法用的是哪種排序算法擦俐。但是我覺(jué)得數(shù)組的內(nèi)容太多了脊阴,今天進(jìn)行一次梳理,希望能把數(shù)組說(shuō)清楚蚯瞧。
1.數(shù)組的創(chuàng)建
方式1:構(gòu)造函數(shù)
var array = new Array();
var array = new Array(7);//指定數(shù)組長(zhǎng)度為7
優(yōu)點(diǎn):可以指定數(shù)組的長(zhǎng)度嘿期。
缺點(diǎn):
1.代碼多。
2.new屬于強(qiáng)引用埋合,該變量不會(huì)被GC回收备徐,會(huì)一直占用內(nèi)存。
方式2:直接量
var array = [];
var array = [1,2,3,4];
優(yōu)點(diǎn):寫(xiě)法簡(jiǎn)潔方便甚颂。
數(shù)組在內(nèi)存中是分兩部分存放的蜜猾,一部分是棧式結(jié)構(gòu),存儲(chǔ)各個(gè)元素的內(nèi)存地址振诬。另一部分是堆式結(jié)構(gòu)蹭睡,存放真實(shí)的元素。詳情參考我的另一篇文章求探討:Java和JavaScript數(shù)組的性能赶么。
除了上面的一維數(shù)組肩豁,還有二維數(shù)組以及多維數(shù)組,不同類(lèi)型的數(shù)組發(fā)揮著不同的功能禽绪。
2.數(shù)組的原生API
為了方便開(kāi)發(fā)蓖救,JavaScript數(shù)組提供了很多好用的API。我來(lái)和大家一一介紹印屁。
(1) push 和 pop
push和pop應(yīng)該放到一起循捺,push將元素加到數(shù)組的尾部,pop將元素從數(shù)組的尾部刪除雄人。
push:接收任意數(shù)量的元素从橘,把它們添加到數(shù)組尾部念赶,返回值為修改后數(shù)組的長(zhǎng)度。
var array = [1,2,3,4];
var result = array.push(5,6,7);
console.log(result);//7
console.log(array.length);//7
console.log(array.toString());//1,2,3,4,5,6,7
pop:刪除數(shù)組末尾的最后一項(xiàng)恰力,返回值是移除的元素叉谜。
var array = [1,2,3,4];
var result = array.pop();
console.log(result);//4
console.log(array.length);//3
console.log(array.toString());//1,2,3
(2) unshift 和 shift
unshift:將參數(shù)添加到數(shù)組的頭部,返回值是修改后數(shù)組的長(zhǎng)度踩萎。
var array = [1,2,3,4];
var result = array.unshift(5,6,7);
console.log(result);//7
console.log(array.length);//7
console.log(array.toString());//5,6,7,1,2,3,4
shift:刪除數(shù)組頭部的第一項(xiàng)停局,返回值是移除的元素。
var array = [1,2,3,4];
var result = array.shift();
console.log(result);//1
console.log(array.length);//3
console.log(array.toString());//2,3,4
(3) join
jion將數(shù)組的元素連接成一個(gè)字符串香府,接受的唯一參數(shù)是分隔符董栽,如果省略的話,默認(rèn)使用逗號(hào)作為分隔符企孩。
var array = [1,2,3,4];
var result = array.join();
var result1 = array.join("-");
console.log(result);//1,2,3,4
console.log(result1);//1-2-3-4
(4) sort
sort方法值得詳細(xì)說(shuō)說(shuō)锭碳,因?yàn)閟ort的使用場(chǎng)景很多。
sort()方法接受一個(gè)比較函數(shù)的參數(shù)勿璃,根據(jù)比較函數(shù)的返回值確定排序擒抛。如果不傳入比較函數(shù),JavaScript會(huì)先將數(shù)組的元素轉(zhuǎn)換為字符串類(lèi)型补疑,并依照ASCII碼的值升序排列歧沪。
var array = [1,2,3,4,11];
console.log(array.sort().toString());//1,11,2,3,4
傳入比較函數(shù)參數(shù)時(shí),若比較函數(shù)返回的值為true則交換兩個(gè)元素的位置癣丧,否則不交換槽畔。
var array = [1,2,3,4,11];
console.log(array.sort(function(a,b){return a-b}).toString());//1,2,3,4,11
sort函數(shù)使用的是插入和快排混合的排序算法,或者說(shuō)優(yōu)化的快速排序算法胁编。如果元素個(gè)數(shù)小于等于10則使用插入排序厢钧,因?yàn)椴迦肱判虼藭r(shí)的效率更高。如果元素個(gè)數(shù)超過(guò)10個(gè)則使用快速排序嬉橙。
除此之外早直,JavaScript還會(huì)先把undefined,null先拿出來(lái)市框,不參與排序霞扬,進(jìn)一步提升效率。
(5) indexOf
它可以接收兩個(gè)參數(shù):要查找的項(xiàng)和查找起點(diǎn)的索引枫振。返回值是查找內(nèi)容在數(shù)組中的索引位置喻圃,如果沒(méi)有找到則返回-1。
用這個(gè)方法判斷元素是否在數(shù)組中很是方便粪滤,但是需要注意indexOf在判斷時(shí)使用的是全等“===”斧拍,所以注意數(shù)據(jù)類(lèi)型。
var array = [1,2,3,4];
console.log(array.indexOf(2));//1
console.log(array.indexOf("2"));//-1
(6) every 和 some
every和some都需要傳入一個(gè)判斷函數(shù)杖小。
every判斷是否每一個(gè)元素在判斷函數(shù)中都返回true肆汹,如果某個(gè)元素的判斷為false愚墓,則不再繼續(xù)判斷返回false;
some判斷是否有一個(gè)元素在判斷函數(shù)中返回true昂勉。如果某個(gè)元素判斷為true浪册,則不再繼續(xù)判斷返回true;
var array = [1,2,3,4];
console.log(array.every(function(x){return x<3}));//false
console.log(array.some(function(x){return x<3}));//true
(7) map, reduce和 filter
map是將數(shù)組中的每個(gè)元素都按照傳入的函數(shù)轉(zhuǎn)換為新的元素岗照,并返回新的數(shù)組村象。
var array =[1,2,3,4];
var newArray = array.map(function(x){return x+1});
console.log(newArray.toString());//2,3,4,5
reduce是聚合操作,將每一個(gè)元素按照傳入的函數(shù)操作攒至,生成最終的結(jié)果煞肾。reduce的傳入函數(shù)可以獲得四個(gè)參數(shù),前一個(gè)元素嗓袱,當(dāng)前元素,當(dāng)前元素索引习绢,數(shù)組渠抹。
var array =[1,2,3,4];
var result= array.reduce(function(pre,current,index,array){return pre+current});
console.log(result);//10
filter是篩選函數(shù),返回符合篩選函數(shù)的數(shù)組闪萄。
var array =[1,2,3,4];
var newArray = array.filter(function(x){return x>2});
console.log(newArray.toString());//3,4
(7)其他API
contract:連接兩個(gè)數(shù)組梧却。
reverse:倒序翻轉(zhuǎn)數(shù)組。
forEach:循環(huán)數(shù)組中的每一個(gè)元素败去。
如果文章中有理解不正確的地方放航,歡迎大家?guī)兔ρ耪?/p>