數(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ù)吏祸。