JS數(shù)組知多少

版權(quán)聲明:文章首發(fā)于本人簡(jiǎn)書(shū)賬號(hào)人生還有多少個(gè)二十年
歡迎轉(zhuǎn)載石窑,轉(zhuǎn)載請(qǐng)注明出處

前言

數(shù)組是編程語(yǔ)言中最為常見(jiàn)的數(shù)據(jù)類型之一蚓炬,跟對(duì)象相比,它的突出特點(diǎn)是"有序"经宏。JS的數(shù)組還有這些特點(diǎn):數(shù)組成員類型可以不一致熄捍,數(shù)組長(zhǎng)度可以動(dòng)態(tài)調(diào)整余耽,數(shù)組下標(biāo)越界不報(bào)錯(cuò)。

// 一個(gè)數(shù)組币喧,可以同時(shí)包含多種數(shù)據(jù)類型的數(shù)據(jù)袱耽,而且,數(shù)組之中還可以嵌套數(shù)組
var arr = [1, "2", true, null, undefined, [{a:1,b:2,c:3}]];
arr.length; // 6
// 不會(huì)越界報(bào)錯(cuò)史翘,而是在指定索引處創(chuàng)建新元素冀续,并自動(dòng)更新數(shù)組的length屬性值洪唐。
arr[100] = 100; 
arr.length; // 101
// 數(shù)組的length屬性是可讀可寫(xiě)
// length值調(diào)低,則會(huì)刪除部分元素问欠;調(diào)高,則生成稀疏數(shù)組
arr.length = 6;
arr; // [1, "2", true, null, undefined, [{a:1,b:2,c:3}]]
arr.length = 10;
arr[7]; // undefined

數(shù)組的常用方法

接下來(lái)旗国,以例子為主滚澜,解釋為輔,簡(jiǎn)述相關(guān)知識(shí)

1. 增刪元素(push()、pop()萝招、unshift()存捺、shift())

var arr = [];
arr.push("a", "b"); // 2
arr // ["a", "b"]
arr.pop(); // "b"
arr // ["a"]
arr.unshift("x", "y"); // 3
arr // ["x", "y", "a"]
arr.shift(); // "x"
arr // ["y", "a"]
  • push()和unshift()都是向數(shù)組添加元素捌治,可以同時(shí)添加多個(gè)元素,它們的返回值都是更新后的數(shù)組的長(zhǎng)度兼吓;
  • pop()和shift()都是從數(shù)組中移除元素森枪,只移除一項(xiàng),它們的返回值都是被移除的那個(gè)元素浑娜;
  • push()和pop()的操作發(fā)生在數(shù)組尾部筋遭,unshift()和shift()的操作發(fā)生在數(shù)組頭部暴拄;
  • 棧數(shù)據(jù)結(jié)構(gòu)的訪問(wèn)規(guī)則是LIFO(后進(jìn)先出),插入和刪除的操作發(fā)生在同一端次和;而隊(duì)列的訪問(wèn)規(guī)則為FIFO(先進(jìn)先出)踏施,插入和刪除的操作不在同一端;
  • push()配合pop()可以模擬棧的行為畅形;shift()和push()日熬、unshift()和pop()都可以實(shí)現(xiàn)類似隊(duì)列的行為。

2. 排序(reverse()耘纱、sort())

var arr1 = [1, 2, 3];
arr1.reverse(); // [3, 2, 1]
arr1; // [3, 2, 1]

var arr2 = [1, 3, 2];
arr2.sort(); // [1, 2, 3]
arr2; // [1, 2, 3]
  • 從上面可以看出毕荐,reverse()和sort()都會(huì)改變?cè)瓟?shù)組憎亚,并且它們的返回值都是排序之后的數(shù)組。
  • reverse()用于反轉(zhuǎn)數(shù)組蝶锋。
  • sort()用于以升序或者降序的方式排列數(shù)組項(xiàng)什往。

為了實(shí)現(xiàn)排序,sort()方法會(huì)調(diào)用每個(gè)數(shù)組項(xiàng)的toString()方法第献,然后比較得到的字符串庸毫,以確定如何排序衫樊。即使數(shù)組中的每一項(xiàng)都是數(shù)值,sort()方法比較的也是字符串载佳。

var arr3 = [1, 2, 10];
arr3.sort(); // [1, 10, 2]
var arr4 = ["a", "c", "b", "B"];
arr4.sort(); // ["B", "a", "b", "c"]

sort()可以接收一個(gè)函數(shù)臀栈,用于提供更實(shí)用的排序功能。
格式如下:sort(fn(arg1, arg2))

var arr5 = [1, 3, 2];
// 升序排列
arr5.sort(function(a, b){
    return a - b;
}); // [1, 2, 3]
arr5 //  [1, 2, 3]
// 降序排列
arr5.sort(function(a, b){
    return b - a;
}); // [3, 2, 1]

3. 操作方法(concat()姑躲、slice()、splice())

// concat():用于合并多個(gè)數(shù)組卖怜,生成新數(shù)組阐枣,對(duì)原數(shù)組沒(méi)有影響
// 數(shù)組合并過(guò)程中蔼两,各數(shù)組只拆除最外層的“[]”,合并操作并不是遞歸的
// 這表明娩贷,生成的新數(shù)組仍然可以含有數(shù)組
var arr1 = [];
arr1.concat([1], [2], [[3,4], [5, 6]]); // [1, 2, [3, 4], [5, 6]];
arr1; // []
// slice(): 用于截取子數(shù)組锁孟,且操作并不影響原數(shù)組
// 可以給定兩個(gè)參數(shù)品抽,一個(gè)是起始索引甜熔,一個(gè)是結(jié)束索引
var arr2 = ["a", "b", "c", "d"];
// 沒(méi)給定參數(shù)腔稀,相當(dāng)于復(fù)制數(shù)組
arr2.slice(); // ["a", "b", "c", "d"]
arr2 // ["a", "b", "c", "d"]
// 只給定起始索引,默認(rèn)從該索引處一直截取到末尾
arr2.slice(2); //  ["c", "d"]
arr2 // ["a", "b", "c", "d"]
// 記清楚了淡喜!從起始索引截取到結(jié)束索引之前诵闭,并不包含結(jié)束索引處的元素
arr2.slice(1, 3); // ["b", "c"]
arr2 //  ["a", "b", "c", "d"] 
// splice(): 增疏尿、刪、替換數(shù)組元素锌俱,直接修改原數(shù)組
// 該操作的返回值是被刪除的元素組成的數(shù)組
var arr3 = ["1", "2", "3", "a", "b", "c"];
// 從索引為4處開(kāi)始刪除元素敌呈,一直到數(shù)組末尾
arr3.splice(4); // ["b", "c"]
arr3 // ["1", "2", "3", "a"]
// 從索引為0處開(kāi)始,刪除2個(gè)元素
arr3.splice(0, 2); // ["1", "2"]
arr3 // ["3", "a"]
// 從索引為0處開(kāi)始匹舞,刪除0個(gè)元素线脚,并在該處插入1個(gè)元素"x"
arr3.splice(0, 0, "x"); // []
arr3 // ["x", "3", "a"]
// 刪除幾個(gè)元素,就插入幾個(gè)元素姊舵,可以實(shí)現(xiàn)splice()替換元素功能
arr3.splice(0, 1, "y"); // ["x"]
arr3 // ["y", "3", "a"]

4. 位置方法

// indexOf()和lastIndexOf()都可以用于查詢指定元素在數(shù)組中的位置,
// 返回第一個(gè)匹配的元素的索引括丁。
// 兩者的區(qū)別在于伶选,前者是從數(shù)組頭部開(kāi)始查找,后者則從尾部開(kāi)始查找
[1,2,4,-1,2].indexOf(2) // 1
[1,2,4,-1,2].lastIndexOf(2) // 4

5. 迭代方法(every()构资、some()陨簇、filter()河绽、map()、forEach())

[1,2,3].every(function(item, index, array){return item > 0;});
// true
[1,2,3].every(function(item, index, array){return item > 2;});
// false
[1,2,3].some(function(item, index, array){return item > 2;});
// true
[1,2,3].filter(function(item, index, array){return item > 2;});
// [3]
[1,2,3].map(function(item, index, array){   return item * 2;});
// [2, 4, 6]
var sum = 0;
[1,2,3].forEach(function(item, index, array){sum += item;});
sum // 6

這五個(gè)迭代方法都接收一個(gè)函數(shù)纹笼,并且對(duì)數(shù)組中的每一項(xiàng)都運(yùn)行給定函數(shù)允乐,這些迭代方法都不會(huì)改變?cè)瓟?shù)組削咆。它們的返回值如下:

  • every():給定函數(shù)對(duì)每一項(xiàng)都返回true拨齐,則返回true。
  • some():給定函數(shù)對(duì)任一項(xiàng)返回true,則返回true厦滤。
  • filter():返回該函數(shù)會(huì)返回true的項(xiàng)組成的數(shù)組援岩。
  • map():返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組。
  • forEach():沒(méi)有返回值掏导。

6. 歸并方法(reduce()享怀、reduceRight())

[1,2,3].reduce(function(prev, cur){return prev + cur});
// 6
[1,2,3].reduceRight(function(prev, cur){return prev + cur});
// 6

reduce()和reduceRight()這兩個(gè)方法都會(huì)迭代數(shù)組的所有項(xiàng),然后構(gòu)建一個(gè)最終返回的值趟咆。前者的迭代順序是從前往后添瓷,后者則相反

7. 轉(zhuǎn)換方法(join())

join()可以將數(shù)組轉(zhuǎn)換為字符串,相反值纱,split()可以將字符串轉(zhuǎn)換為數(shù)組鳞贷。
可以給它們指定分隔符虐唠,若未指定搀愧,則默認(rèn)使用逗號(hào)。

var arr = [1,2,3];
arr.join(); // "1,2,3"
arr.join(""); // "123"
arr.join("-"); // "1-2-3"
arr.join().split(); // ["1,2,3"]

var str = "abc";
str.split(); // ["abc"]
str.split(""); // ["a", "b", "c"]
str.split("-"); // ["abc"]
str.split().join(); // "abc"

技巧與提示

  • 了解各個(gè)數(shù)組方法的功能疆偿,接收哪些參數(shù)咱筛,有沒(méi)有返回值,返回值是什么杆故,會(huì)不會(huì)改變?cè)瓟?shù)組眷蚓,瀏覽器兼容性如何。
  • 位置方法反番、迭代方法和歸并方法都是ES5的標(biāo)準(zhǔn)。IE兼容性:IE9+叉钥。

參考資源

  • 《JavaScript高級(jí)程序設(shè)計(jì)(第3版)》
  • 《JavaScript權(quán)威指南》
  • MDN
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末罢缸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子投队,更是在濱河造成了極大的恐慌枫疆,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敷鸦,死亡現(xiàn)場(chǎng)離奇詭異息楔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)扒披,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)值依,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人碟案,你說(shuō)我怎么就攤上這事愿险。” “怎么了价说?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵辆亏,是天一觀的道長(zhǎng)风秤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)扮叨,這世上最難降的妖魔是什么缤弦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮彻磁,結(jié)果婚禮上碍沐,老公的妹妹穿的比我還像新娘。我一直安慰自己兵迅,他們只是感情好抢韭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著恍箭,像睡著了一般刻恭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扯夭,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天鳍贾,我揣著相機(jī)與錄音,去河邊找鬼交洗。 笑死骑科,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的构拳。 我是一名探鬼主播咆爽,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼置森!你這毒婦竟也來(lái)了斗埂?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凫海,失蹤者是張志新(化名)和其女友劉穎呛凶,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體行贪,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漾稀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了建瘫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崭捍。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖啰脚,靈堂內(nèi)的尸體忽然破棺而出缕贡,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布晾咪,位于F島的核電站收擦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谍倦。R本人自食惡果不足惜塞赂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昼蛀。 院中可真熱鬧宴猾,春花似錦、人聲如沸叼旋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)夫植。三九已至讹剔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間详民,已是汗流浹背延欠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沈跨,地道東北人由捎。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像饿凛,于是被迫代替她去往敵國(guó)和親狞玛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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

  • 前言 Array是js中引用的數(shù)據(jù)類型,我感覺(jué)不光除了Object外,Array也是平常開(kāi)發(fā)中尤為重要的一種數(shù)據(jù)類...
    Ziksang閱讀 1,092評(píng)論 4 16
  • 說(shuō)點(diǎn)啥 數(shù)組是程序員的法寶之一杀狡,善用數(shù)組方法可以使數(shù)據(jù)處理變的簡(jiǎn)單(優(yōu)雅)。每次重新看數(shù)組的知識(shí)都有新收獲贰镣。 什么...
    石菖蒲_xl閱讀 927評(píng)論 0 11
  • 由于最近都在freecodecamp上刷代碼呜象,運(yùn)用了很多JavaScript數(shù)組的方法,因此做了一份關(guān)于JavaS...
    2bc5f46e925b閱讀 1,979評(píng)論 0 16
  • 檢測(cè)數(shù)組 對(duì)于一個(gè)網(wǎng)頁(yè)碑隆,或者一個(gè)全局作用域而言恭陡,使用 instanceof 操作符就能得到滿意的結(jié)果: 支持 Ar...
    林深鹿影閱讀 453評(píng)論 0 0
  • 數(shù)組 知識(shí)匯總 前置知識(shí): 數(shù)組是一個(gè)有序的數(shù)據(jù)集合,可使用數(shù)組名稱和索引進(jìn)行訪問(wèn)上煤。 在JavaScript中數(shù)組...
    Daeeman閱讀 667評(píng)論 1 7