JS-這篇文章帶你弄懂JavaScript數(shù)組

array.jpg

基本上每種編程語(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>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市圆裕,隨后出現(xiàn)的幾起案子广鳍,更是在濱河造成了極大的恐慌,老刑警劉巖吓妆,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赊时,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡行拢,警方通過(guò)查閱死者的電腦和手機(jī)祖秒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)舟奠,“玉大人竭缝,你說(shuō)我怎么就攤上這事≌犹保” “怎么了抬纸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)晕鹊。 經(jīng)常有香客問(wèn)我松却,道長(zhǎng)暴浦,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任晓锻,我火速辦了婚禮歌焦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘砚哆。我一直安慰自己独撇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布躁锁。 她就那樣靜靜地躺著纷铣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪战转。 梳的紋絲不亂的頭發(fā)上搜立,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音槐秧,去河邊找鬼啄踊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛刁标,可吹牛的內(nèi)容都是我干的颠通。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼膀懈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼顿锰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起启搂,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤硼控,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后胳赌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體淀歇,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年匈织,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浪默。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缀匕,死狀恐怖纳决,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乡小,我是刑警寧澤阔加,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站满钟,受9級(jí)特大地震影響胜榔,放射性物質(zhì)發(fā)生泄漏胳喷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一夭织、第九天 我趴在偏房一處隱蔽的房頂上張望吭露。 院中可真熱鬧,春花似錦尊惰、人聲如沸讲竿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)题禀。三九已至,卻和暖如春膀捷,著一層夾襖步出監(jiān)牢的瞬間迈嘹,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工全庸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留江锨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓糕篇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親酌心。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拌消,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 第三章 類(lèi)型、值和變量 1安券、存取字符串墩崩、數(shù)字或布爾值的屬性時(shí)創(chuàng)建的臨時(shí)對(duì)象稱做包裝對(duì)象,它只是偶爾用來(lái)區(qū)分字符串值...
    坤少卡卡閱讀 639評(píng)論 0 1
  • 數(shù)組是值的有序集合侯勉。每個(gè)值叫做一個(gè)元素鹦筹,而每個(gè)元素在數(shù)組中有一個(gè)位置,以數(shù)字表示址貌,稱為索引铐拐。 JavaScript...
    劼哥stone閱讀 1,130評(píng)論 6 20
  • 由于最近都在freecodecamp上刷代碼,運(yùn)用了很多JavaScript數(shù)組的方法练对,因此做了一份關(guān)于JavaS...
    2bc5f46e925b閱讀 1,979評(píng)論 0 16
  • 原來(lái)有文章說(shuō) ruby速度慢遍蟋,rails太臃腫。 最近學(xué)習(xí)了spring boot之后螟凭,才發(fā)現(xiàn)虚青。ruby最大的壞處...
    jimxl閱讀 309評(píng)論 0 0
  • 沒(méi)有故事,不成童年螺男。童年的那些故事是色彩斑斕的記憶棒厘,伴隨終生纵穿。之恩每天晚上睡前的必修功課就是聽(tīng)“凱叔講故事”,聽(tīng)得...
    岳老師閱讀 928評(píng)論 0 0