JavaScript數(shù)組--Array對(duì)象

數(shù)組對(duì)象的作用

使用單獨(dú)的變量名來(lái)存儲(chǔ)一系列的值。數(shù)組是一種特殊的對(duì)象


數(shù)組的創(chuàng)建方式

1.字面量

var arr = [1,2,3,4];

2.通過(guò)new Array(length/content);

var arr = new Array(1,2,3,4);

注意:Array構(gòu)造函數(shù)有一個(gè)很大的問(wèn)題寒矿,就是不同的參數(shù),會(huì)導(dǎo)致它的行為不一致邓馒。

1.無(wú)參數(shù)時(shí)奏夫,返回一個(gè)空數(shù)組

2.單個(gè)正整數(shù)參數(shù),會(huì)當(dāng)成的新數(shù)組的長(zhǎng)度湖饱,創(chuàng)建對(duì)應(yīng)長(zhǎng)度的稀松數(shù)組,每個(gè)位置都是空值

3.單個(gè)非正整數(shù)的數(shù)值作為參數(shù)時(shí)啄踊,會(huì)報(bào)錯(cuò)

4.單個(gè)非數(shù)值參數(shù)(比如字符串寸潦、布爾值、對(duì)象等)社痛,則該參數(shù)是返回的新數(shù)組的成員

5.多參數(shù)時(shí)见转,所有參數(shù)都是返回的新數(shù)組的成員

所以正是因?yàn)锳rray作為構(gòu)造函數(shù),行為很不一致蒜哀。因此斩箫,在生成新數(shù)組吏砂,不建議使用new Array()的方式來(lái)創(chuàng)建數(shù)組,而直接使用數(shù)組字面量是更好的做法乘客。

另外狐血,在傳遞一個(gè)參數(shù)為一個(gè)正整數(shù),返回?cái)?shù)組的成員都是空位易核。雖然讀取的時(shí)候返回undefined匈织,但實(shí)際上該位置沒(méi)有任何值。雖然可以取到length屬性牡直,但是取不到鍵名缀匕。


數(shù)組的讀和寫以及刪除

1.arr[num] ?

其實(shí)可以溢出讀,只不過(guò)讀取的結(jié)果是undefined

2.arr[num] = xxx

也可以溢出寫碰逸,中間空的就為空值乡小。讀取空置的位置,結(jié)果為undefined

3.delete arr[num];

通過(guò)delete關(guān)鍵字來(lái)刪除數(shù)組中對(duì)應(yīng)下標(biāo)的元素

4.遍歷數(shù)組

for(var 數(shù)組元素變量 in 要遍歷的數(shù)組)


數(shù)組的靜態(tài)方法

Array.isArray()

判斷一個(gè)值是否為數(shù)組饵史。

typeof運(yùn)算符只能顯示數(shù)組的類型是Object满钟,使用Array.isArray()可以判斷是不是數(shù)組,是數(shù)組返回true胳喷,非數(shù)組返回false湃番,彌補(bǔ)typeof運(yùn)算符的不足。


Array實(shí)例的方法

所有的數(shù)組對(duì)象有下面的方法

valueOf()

返回?cái)?shù)組本身

1.改變?cè)瓟?shù)組的方法

push()

在數(shù)組最后添加一個(gè)或多個(gè)元素吭露,并返回添加新元素后的數(shù)組長(zhǎng)度吠撮,注意,該方法會(huì)改變?cè)瓟?shù)組奴饮。

如果需要合并兩個(gè)數(shù)組,可以這樣寫:Array.prototype.push.apply(a, b)或者a.push.apply(a, b)

push() 還可以用于向?qū)ο筇砑釉卦褡牵砑雍蟮膶?duì)象變成類似數(shù)組的對(duì)象var a = {a: 1};[].push.call(a, 2);

pop()

在數(shù)組最后刪除一個(gè)元素戴卜,并返回該元素。注意琢岩,該方法會(huì)改變?cè)瓟?shù)組投剥。

對(duì)空數(shù)組使用pop方法,不會(huì)報(bào)錯(cuò)担孔,而是返回undefined江锨。

push和pop結(jié)合使用,就構(gòu)成了“后進(jìn)先出”的棧結(jié)構(gòu)(stack)糕篇。

unshift()

在數(shù)組的開頭添加一個(gè)或多個(gè)元素啄育,并返回添加新元素后的數(shù)組長(zhǎng)度。注意拌消,該方法會(huì)改變?cè)瓟?shù)組挑豌。

shift()

刪除第一個(gè)元素,并返回該元素。注意氓英,該方法會(huì)改變?cè)瓟?shù)組侯勉。

shift方法可以遍歷并清空一個(gè)數(shù)組,因?yàn)樗看畏祷氐谝粍h除的元素铝阐,并刪除了數(shù)組中的這元素

push和shift結(jié)合使用,就構(gòu)成了“先進(jìn)先出”的隊(duì)列結(jié)構(gòu)(queue)。

reverse()

顛倒數(shù)組中元素的順序炎咖,返回改變后的數(shù)組央碟。注意,該方法將改變?cè)瓟?shù)組啊鸭。

splice()

截取并添加锹淌。返回被截取部分,添加在切口處添加赠制,添加的新數(shù)據(jù)在原數(shù)組上赂摆。注意,該方法會(huì)改變?cè)瓟?shù)組钟些。

arr.splice(從第幾位開始, 截取的長(zhǎng)度, 在切口處添加的數(shù)據(jù)1, 在切口處添加的數(shù)據(jù)2, ...);

如果只提供第一個(gè)參數(shù)烟号,等同于將原數(shù)組在指定位置拆分成兩個(gè)數(shù)組。

如果沒(méi)有傳參政恍,等同于沒(méi)有截取導(dǎo)也沒(méi)有添加汪拥,原數(shù)組不變,返回的空數(shù)組[ ]????

sort()

sort方法對(duì)數(shù)組成員進(jìn)行排序篙耗,默認(rèn)是按照字典順序排序迫筑。注意,該方法會(huì)改變?cè)瓟?shù)組

需要特殊注意宗弯。sort方法不是按照大小排序脯燃,而是按照對(duì)應(yīng)字符串的字典順序排序。也就是說(shuō)蒙保,數(shù)值會(huì)被先轉(zhuǎn)成字符串辕棚,再按照字典順序進(jìn)行比較,所以101排在11的前面邓厕。

如果想讓sort方法按照自定義方式排序逝嚎,可以傳入一個(gè)函數(shù)作為參數(shù),表示按照自定義方法進(jìn)行排序详恼。該函數(shù)本身又接受兩個(gè)參數(shù)补君,表示進(jìn)行比較的兩個(gè)元素。如果返回值大于0昧互,表示第一個(gè)元素排在第二個(gè)元素后面赚哗;其他情況下她紫,都是第一個(gè)元素排在第二個(gè)元素前面。

即這個(gè)傳入的函數(shù)的規(guī)則是:

1.必須寫2個(gè)形參屿储;

2.當(dāng)返回值為負(fù)數(shù)時(shí)贿讹,那么前面的數(shù)放在前面;

? 當(dāng)返回值為正數(shù)時(shí)够掠,那么后面的數(shù)放在前面民褂;

? 當(dāng)返回值為0時(shí),不動(dòng)疯潭。

arr.sort(function(a,b){

? ? //return a-b;升序

? ? //return b-a;降序

});

給一個(gè)有序數(shù)組亂序:arr.sort(function(){return Math.random()-0.5})//里面返回的是隨機(jī)正負(fù)赊堪,所以是隨機(jī)換位置或者不換位置。


2.不改變?cè)瓟?shù)組的數(shù)組方法

concat()

用于多個(gè)數(shù)組的合并竖哩。它將新數(shù)組的成員哭廉,添加到原數(shù)組的尾部,然后返回一個(gè)新數(shù)組相叁,原數(shù)組不變遵绰。

除了接受數(shù)組作為參數(shù),concat也可以接受其他類型的值作為參數(shù)增淹。它們會(huì)作為新的元素椿访,添加數(shù)組尾部。

如果不提供參數(shù)虑润,concat方法返回當(dāng)前數(shù)組的一個(gè)淺拷貝成玫。所謂“淺拷貝”,指的是如果數(shù)組成員包括復(fù)合類型的值(比如對(duì)象)拳喻,則新數(shù)組拷貝的是該值的引用哭当。

原數(shù)組的成員中包含對(duì)象,concat方法不管有沒(méi)有參數(shù)冗澈,總是返回該對(duì)象的引用钦勘。

concat方法也可以用于將對(duì)象合并為數(shù)組,但是必須借助call方法渗柿。[].concat.call({a: 1}, {b: 2})

toString()

返回?cái)?shù)組的字符串形式

var a = [1, 2, 3];a.toString() // "1,2,3"

var a = [1, 2, 3, [4, 5, 6]];a.toString() // "1,2,3,4,5,6"

slice()

截取个盆,返回截取部分

兩個(gè)參數(shù)時(shí):arr.slice(從該位開始截取脖岛,截取到該位)

如果只傳一個(gè)參數(shù):表示從該位開始朵栖,截取到最后。

沒(méi)有參數(shù)柴梆,實(shí)際上等于返回一個(gè)原數(shù)組的拷貝陨溅,可以理解為從0開始截取截取到最后,即截取了整個(gè)原數(shù)绍在,但原數(shù)組不變门扇,實(shí)現(xiàn)了拷貝數(shù)組雹有。

join()

將所有數(shù)組成員通過(guò)傳遞的參數(shù)作為連接符,連接成一個(gè)字符串返回臼寄。

如果不提供參數(shù)霸奕,默認(rèn)用逗號(hào)分隔。

如果數(shù)組成員是undefined或null或空位吉拳,會(huì)被轉(zhuǎn)成空字符串质帅。

通過(guò)call方法,這個(gè)方法也可以用于字符串留攒。

Array.prototype.join.call('hello', '-') ? // "h-e-l-l-o"

join方法也可以用于類似數(shù)組的對(duì)象煤惩。

var obj = {0:'a',1:'b',length:2};

Array.prototype.join.call(obj,"-") ? ?//'a-b'

split()

注意:其實(shí)是字符串的方法:

將字符串按照指定的分隔符拆分,拆分成數(shù)組炼邀。返回該拆分的數(shù)組魄揉,不過(guò)按照什么拆分,什么就會(huì)消失拭宁。

如果split()不傳參洛退,則表示將它整個(gè)變成數(shù)組中的一個(gè)成員。


3.ES5中新增的數(shù)組方法

(1)位置方法:

indexOf()

返回給定元素在數(shù)組中第一次出現(xiàn)的位置红淡,如果沒(méi)有出現(xiàn)則返回-1不狮。

方法還可以接受第二個(gè)參數(shù),表示搜索的開始位置在旱。

lastIndexOf()

返回給定元素在數(shù)組中最后一次出現(xiàn)的位置摇零,如果沒(méi)有出現(xiàn)則返回-1。

注意桶蝎,如果數(shù)組中包含NaN驻仅,上面這兩個(gè)方法不適用,即無(wú)法確定數(shù)組成員是否包含NaN登渣。(不能找NaN)噪服。

這是因?yàn)檫@兩個(gè)方法內(nèi)部,使用嚴(yán)格相等運(yùn)算符(===)進(jìn)行比較胜茧,而NaN是唯一一個(gè)不等于自身的值粘优。

(2)迭代方法

every() ? / ??some()

兩個(gè)方法類似“斷言”(assert),用來(lái)判斷數(shù)組成員是否符合某種條件呻顽。

它們接受一個(gè)函數(shù)作為參數(shù)雹顺,所有數(shù)組成員依次執(zhí)行該函數(shù),返回一個(gè)布爾值廊遍。該函數(shù)接受三個(gè)參數(shù)嬉愧,依次是當(dāng)前位置的成員、當(dāng)前位置的序號(hào)和整個(gè)數(shù)組喉前。

some方法是只要有一個(gè)數(shù)組成員的返回值是true没酣,則整個(gè)some方法的返回值就是true王财,否則false。

every方法則是所有數(shù)組成員的返回值都是true裕便,才返回true绒净,否則false。

filter()

filter的參數(shù)是一個(gè)函數(shù)偿衰,所有數(shù)組成員依次執(zhí)行該函數(shù)疯溺,返回結(jié)果為true的成員組成一個(gè)新數(shù)組返回。該方法不會(huì)改變?cè)瓟?shù)組哎垦。

filter方法的參數(shù)函數(shù)可以接受三個(gè)參數(shù)囱嫩,第一個(gè)參數(shù)是當(dāng)前數(shù)組成員的值,這是必需的漏设,后兩個(gè)參數(shù)是可選的墨闲,分別是當(dāng)前數(shù)組成員的位置和整個(gè)數(shù)組。

map()

該方法對(duì)數(shù)組的所有成員依次調(diào)用一個(gè)函數(shù)郑口,根據(jù)函數(shù)結(jié)果返回一個(gè)新數(shù)組鸳碧。不改變?cè)瓟?shù)組。

map方法接受一個(gè)函數(shù)作為參數(shù)犬性。該函數(shù)調(diào)用時(shí)瞻离,map方法會(huì)將其傳入三個(gè)參數(shù),分別是當(dāng)前成員乒裆、當(dāng)前位置和數(shù)組本身套利。

map方法不僅可以用于數(shù)組,還可以用于字符串鹤耍,用來(lái)遍歷字符串的每個(gè)字符肉迫。但是,不能直接使用稿黄,而要通過(guò)函數(shù)的call方法間接使用喊衫,或者先將字符串轉(zhuǎn)為數(shù)組,然后使用杆怕。

map方法還可以接受第二個(gè)參數(shù)族购,表示回調(diào)函數(shù)執(zhí)行時(shí)this所指向的對(duì)象。

如果數(shù)組有空位陵珍,map方法的回調(diào)函數(shù)在這個(gè)位置不會(huì)執(zhí)行寝杖,會(huì)跳過(guò)數(shù)組的空位。但是撑教,map方法不會(huì)跳過(guò)undefined和null

forEach()

forEach方法與map方法很相似朝墩,也是遍歷數(shù)組的所有成員醉拓,執(zhí)行某種操作伟姐,但是forEach方法一般不返回值收苏,只用來(lái)操作數(shù)據(jù)。如果需要有返回值愤兵,一般使用map方法鹿霸。

forEach方法的參數(shù)與map方法一致,也是一個(gè)函數(shù)秆乳,數(shù)組的所有成員會(huì)依次執(zhí)行該函數(shù)懦鼠。它接受三個(gè)參數(shù),分別是當(dāng)前位置的值屹堰、當(dāng)前位置的編號(hào)和整個(gè)數(shù)組肛冶。

forEach方法也可以接受第二個(gè)參數(shù),用來(lái)綁定回調(diào)函數(shù)的this關(guān)鍵字扯键。

注意睦袖,forEach方法無(wú)法中斷執(zhí)行,總是會(huì)將所有成員遍歷完荣刑。如果希望符合某種條件時(shí)馅笙,就中斷遍歷,要使用for循環(huán)厉亏。

orEach方法會(huì)跳過(guò)數(shù)組的空位董习。不會(huì)跳過(guò)undefined和null!

forEach方法也可以用于類似數(shù)組的對(duì)象和字符串爱只。

(3)縮小范圍

reduce()皿淋,reduceRight()

reduce方法和reduceRight方法依次處理數(shù)組的每個(gè)成員,最終累計(jì)為一個(gè)值恬试。

它們的差別是沥匈,reduce是從左到右處理(從第一個(gè)成員到最后一個(gè)成員),reduceRight則是從右到左(從最后一個(gè)成員到第一個(gè)成員)忘渔,其他完全一樣高帖。

這兩個(gè)方法的第一個(gè)參數(shù)都是一個(gè)函數(shù)。該函數(shù)接受以下四個(gè)參數(shù)畦粮。

1.累積變量散址,默認(rèn)為數(shù)組的第一個(gè)成員

2.當(dāng)前變量,默認(rèn)為數(shù)組的第二個(gè)成員

3.當(dāng)前位置(從0開始)

4.原數(shù)組

這四個(gè)參數(shù)之中宣赔,只有前兩個(gè)是必須的预麸,后兩個(gè)則是可選的。

如果要對(duì)累積變量指定初值儒将,可以把它放在reduce方法和reduceRight方法的第二個(gè)參數(shù)吏祸。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市钩蚊,隨后出現(xiàn)的幾起案子贡翘,更是在濱河造成了極大的恐慌蹈矮,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸣驱,死亡現(xiàn)場(chǎng)離奇詭異泛鸟,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)踊东,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門北滥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人闸翅,你說(shuō)我怎么就攤上這事再芋。” “怎么了坚冀?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵祝闻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我遗菠,道長(zhǎng)联喘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任辙纬,我火速辦了婚禮豁遭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贺拣。我一直安慰自己蓖谢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布譬涡。 她就那樣靜靜地躺著闪幽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涡匀。 梳的紋絲不亂的頭發(fā)上盯腌,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音陨瘩,去河邊找鬼腕够。 笑死,一個(gè)胖子當(dāng)著我的面吹牛舌劳,可吹牛的內(nèi)容都是我干的帚湘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼甚淡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼大诸!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤资柔,失蹤者是張志新(化名)和其女友劉穎焙贷,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體建邓,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年睁枕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了官边。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡外遇,死狀恐怖注簿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情跳仿,我是刑警寧澤诡渴,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站菲语,受9級(jí)特大地震影響妄辩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜山上,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一眼耀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧佩憾,春花似錦哮伟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至抡驼,卻和暖如春鬼廓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背致盟。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工桑阶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人勾邦。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓蚣录,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親眷篇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子萎河,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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