JS 基礎之數(shù)組

一岸售、數(shù)組

1. 定義
  • 數(shù)組(array)是按次序排列的一組值。每個值的位置都有編號(從 0 開始)厂画,整個數(shù)組用方括號表示凸丸。
var arr = ['a', 'b', 'c'];
  • 任何類型的數(shù)據(jù),都可以放入數(shù)組袱院。
  • 如果數(shù)組的元素還是數(shù)組屎慢,就形成了多維數(shù)組。
2. 數(shù)組的本質(zhì)

本質(zhì):數(shù)組屬于一種特殊的對象忽洛。typeof 運算符返回數(shù)組的類型是 object.
特殊性:數(shù)組的鍵名是按次序排列的一組整數(shù)(0腻惠,1,2…)

  • 數(shù)組的鍵名其實也是字符串欲虚〖啵可以用數(shù)值讀取,是因為非字符串的鍵名會被轉(zhuǎn)為字符串复哆。這點在賦值時也成立欣喧,先轉(zhuǎn)成字符串再進行賦值。
var arr = ['a', 'b', 'c'];
arr['0'] // 'a'
arr[0] // 'a'
  • 因為數(shù)值鍵名不符合標識符規(guī)范梯找,不能使用點結(jié)構(gòu)讀取唆阿,數(shù)組成員只能用方括號 arr[0]arr['0'] 讀取
3. length 屬性
  • 數(shù)組的 length 屬性锈锤,返回數(shù)組的成員數(shù)量酷鸦。
  • 只要是數(shù)組,就一定有 length 屬性牙咏。length 是動態(tài)的值臼隔,等于鍵名中的最大整數(shù)加上 1.
var arr = ['a', 'b', 'c'];
length.arry   // 3

arr[9] = 'e';
arr.length // 10
  • JavaScript 使用 32 位整數(shù)保存數(shù)組的元素個數(shù)。這意味著妄壶,數(shù)組成員最多只有 4294967295 個(2^32 - 1)個摔握,因此 length 屬性的最大值是 4294967295。
  • length 屬性是可寫的丁寄。若設置一個小于當前成員個數(shù)的值氨淌,該數(shù)組的成員會自動減少到 length 設置的值泊愧。
  • 清空數(shù)組的一個有效方法,就是將 length 屬性設為 0盛正。
  • 若設置 length 大于當前元素個數(shù)删咱,則數(shù)組的成員數(shù)量會增加到這個值,新增的位置都是空位豪筝。
var arr = [ 'a', 'b', 'c' ];
arr.length // 3

arr.length = 4
arr[3]   //undefined
arr.length = 2;
arr // ["a", "b"]
arr.length = 0;
arr // []
  • 由于數(shù)組本質(zhì)上是一種對象痰滋,所以可以為數(shù)組添加屬性,但是這不影響 length 屬性的值续崖。
var a = [];

a['p'] = 'abc';
a.length // 0
a[2.1] = 'abc';
a.length // 0
4. in 運算符
  • 檢查某個鍵名是否存在敲街,適用于對象,也適用于數(shù)組严望。
  • 注意多艇,如果數(shù)組的某個位置是空位,in 運算符返回 false像吻。
var arr = [];
arr[100] = 'a';

100 in arr // true
1 in arr // false
5. 遍歷數(shù)組
  • for...in 循環(huán)可以遍歷數(shù)組峻黍,但它不僅遍歷數(shù)字鍵,還遍歷非數(shù)字鍵拨匆。所以可以使用 for 循環(huán)或 while 循環(huán)遍歷數(shù)組姆涩。
  • 數(shù)組的 forEach 方法也可以用來遍歷數(shù)組:
var colors = ['red', 'green', 'blue'];
colors.forEach(function (color) {
  console.log(color);
});
// red
// green
// blue
6. 數(shù)組的空位
  • 當數(shù)組的某個位置是空元素,即兩個逗號之間沒有任何值涮雷,我們稱該數(shù)組存在空位(hole)。
  • 數(shù)組的空位是可以讀取的轻局,返回 undefined洪鸭。
  • delete 命令刪除一個數(shù)組成員,會形成空位仑扑,且不影響 length 屬性览爵。
var a = [1, , 1];
a.length // 3
a[1]   // undefined

delete a[2];
a.length // 3
  • 空位:表示數(shù)組沒有這個元素,遍歷數(shù)組時空位會跳過
    undefined:表示數(shù)組有這個元素镇饮,值是 undefined蜓竹,遍歷不會跳過
7. 類似數(shù)組的對象

對象的所有鍵名都是正整數(shù)或零,并且有 length 屬性储藐,語法上稱為“類似數(shù)組的對象”(array-like object):

var obj = {
  0: 'a',
  1: 'b',
  2: 'c',
  length: 3
};
  • 這種 length 屬性不是動態(tài)值俱济,不會隨著成員的變化而變化。
  • 類似數(shù)組的對象(array-like object)并不是數(shù)組钙勃,instanceof 運算符返回 false
arrayLike instanceof Array   // false

二蛛碌、Array 對象

1. 構(gòu)造函數(shù)

Array 是 JavaScript 的全局對象,同時是構(gòu)造數(shù)組的一個構(gòu)造函數(shù)辖源。

  1. 基本用法蔚携,以下三種寫法都可以:
let f = new Array('a,' 'b')
let f = Array('a,' 'b')
let f = ['a', 'b']  // 常用方法
f // ["a", "b"]

對于基本類型 Number希太、String 和 Boolean,構(gòu)造函數(shù)時不加 new 創(chuàng)建的的是對應的基本類型酝蜒,加 new 創(chuàng)建的是對象誊辉;對于復雜類型 Object(包括 Array 和 Function),加與不加 new 創(chuàng)建的都是對象亡脑。

  1. 創(chuàng)建空數(shù)組:
var a = new Array(3)
a  // [empty * 3]
a.length   // 3

Array 構(gòu)造函數(shù)的參數(shù) 3堕澄,表示生成一個長度為 3 的數(shù)組,每個位置都是空值:
創(chuàng)建數(shù)組
  1. 不一致性
var a = new Array(3, 3)
// [3, 3]

上面的例子远豺,第一個參數(shù)不再指數(shù)組的長度奈偏,說明 Array 作為構(gòu)造函數(shù)具有不一致性。內(nèi)存圖解:
不一致性
2. JS 中數(shù)組的本質(zhì)
  1. 我們對數(shù)組的理解:數(shù)組就是數(shù)據(jù)的有序集合躯护。
    JS 對數(shù)組的理解:數(shù)組就是原型鏈中有 Array.prototype 的對象惊来。
  • Array 既有 valueOf()toString() 等所有對象都擁有的靜態(tài)方法棺滞,還有 push()裁蚁、pop()shift()继准、join() 等 Array 獨有的方法(Array.prototype)枉证。
  1. Array 與 Object 的區(qū)別
var a = [1,2,3]
var obj = {0:1, 1:2, 2:3, length:3}

二者的內(nèi)存是沒有區(qū)別的,它們的區(qū)別是原型不同移必。內(nèi)存圖解:
Array 與 Object 的區(qū)別
3. 偽數(shù)組
  • 定義:一個對象室谚,有 0,1,2,3,4,5...n,length 這些 key,但原型鏈中沒有 Array.prototype崔泵,這樣的對象就是偽數(shù)組秒赤。
  • 目前知道的偽數(shù)組有
    arguments 對象
    document.querySelectAll('div') 返回的對象
    偽數(shù)組 arguments
4. 數(shù)組的 API

API:瀏覽器提供的接口。

  1. Array.prototype.forEach:遍歷
  • forEach() 方法對數(shù)組的所有成員依次執(zhí)行參數(shù)函數(shù)憎瘸。forEach() 方法的參數(shù)是一個函數(shù)入篮,該函數(shù)接受三個參數(shù):當前值 value、當前位置 key幌甘、整個數(shù)組潮售。
  • 它不返回值,只用來操作數(shù)據(jù)锅风。
arr.forEach( function(){} ) 
forEach()
  • for i 循環(huán)和 Array.prototype.forEach 都可以遍歷數(shù)組酥诽,二者區(qū)別為:
    for 是關鍵字,不是函數(shù)皱埠;Array.prototype.forEach 是一個函數(shù)盆均。
    for 循環(huán)可以 breakcontinueArray.prototype.forEach 不支持 breakcontinue.
  1. Array.prototype.sort:排序
    sort() 方法的內(nèi)置排序一般是快排漱逸。排序后泪姨,原數(shù)組被改變游沿。
    默認按照字典順序排序,若想自定義排序肮砾,可傳入一個函數(shù)作為參數(shù)诀黍。
    sort()
  • 返回 (x-y)和返回(y-x)的排序結(jié)果是不同的,一個從小到大排序仗处,一個從大到小排序眯勾。
  1. Array.prototype.join:連接數(shù)組成員為字符串
    join() 方法以指定參數(shù)作為分隔符,將所有數(shù)組成員連接成一個字符串婆誓。
    如果不提供參數(shù)吃环,默認用逗號分隔。

    join()

  2. Array.prototype.concat:合并多個數(shù)組
    concat() 方法用于多個數(shù)組的合并洋幻。將新數(shù)組的成員添加到原數(shù)組成員的后部郁轻,然后返回一個新數(shù)組,原數(shù)組不變文留。

    concat()

  • 特殊用法:用來復制一個數(shù)組好唯。把當前數(shù)組 concat 一個空數(shù)組 [],返回一個新的數(shù)組燥翅。
  1. Array.prototype.map:映射
  • map() 方法將數(shù)組的所有成員依次傳入?yún)?shù)函數(shù)(與 forEach 相同)骑篙,然后把每一次的執(zhí)行結(jié)果組成一個新數(shù)組返回(與 forEach 不同)。
  • map()方法也接受一個函數(shù)作為參數(shù)森书,該函數(shù)調(diào)用時靶端,map() 方法向它傳入三個參數(shù):當前值 value、當前位置 key 和數(shù)組本身凛膏。
    map()
  1. Array.prototype.filter:過濾
  • filter() 方法用于過濾數(shù)組成員杨名,滿足條件的成員組成一個新數(shù)組返回。
  • 它的參數(shù)是一個函數(shù)译柏,所有數(shù)組成員依次執(zhí)行該函數(shù)镣煮,返回結(jié)果為 true 的成員組成一個新數(shù)組返回姐霍。該方法不會改變原數(shù)組鄙麦。
    filter()
  • 鏈式操作,同時使用 filtermap 方法:
    鏈式操作
  1. Array.prototype.reduce
    reduce() 方法從左到右依次處理數(shù)組的每個成員(從第一個成員到最后一個成員)镊折,最終累計為一個值胯府。
    reduce()
    上面代碼中,reduce 方法求出數(shù)組所有成員的和恨胚。第一個參數(shù)是一個函數(shù)骂因,sum 為之前求和的結(jié)果,n 為當前數(shù)字赃泡,最后一個參數(shù) 0 是初始值寒波。
  • mapfilterreduce 表示:
    map 和 filter 用 reduce 表示
  1. Array.prototype.reverse:顛倒
    reverse() 方法用于顛倒排列數(shù)組元素乘盼,返回改變后的數(shù)組。該方法會改變原數(shù)組俄烁。

    reverse()

  2. Array.prototype.slice:提取

  • slice() 方法用于提取目標數(shù)組的一部分绸栅,返回一個新數(shù)組,原數(shù)組不變页屠。
arr.slice(start, end)
  • 它的第一個參數(shù)為起始位置(從 0 開始)粹胯,第二個參數(shù)為終止位置(不包含該位置的元素本身)。如果省略第二個參數(shù)辰企,則一直返回到原數(shù)組的最后一個成員风纠。
    slice()
  • 特殊用法:最后一個例子 slice 沒有參數(shù),實際上等于返回一個原數(shù)組的拷貝牢贸。
  1. Array.prototype.splice:刪除
  • splice() 方法用于刪除原數(shù)組的一部分成員竹观,并可以在刪除的位置添加新的數(shù)組成員,返回值是被刪除的元素十减。該方法會改變原數(shù)組栈幸。
arr.splice(start, count, addElement1, addElement2, ...)
  • splice 的第一個參數(shù)是刪除的起始位置(從0開始),第二個參數(shù)是被刪除的元素個數(shù)帮辟。如果后面還有更多的參數(shù)速址,則表示這些就是要被插入數(shù)組的新元素。
    splice()
  • 如果只提供第一個參數(shù)由驹,等同于將原數(shù)組在指定位置拆分成兩個數(shù)組:
    splice() 一個參數(shù)
  1. 例題:var a = [1,2,3,4,5,6,7,8,9]芍锚,計算所有奇數(shù)的和。
var a = [1,2,3,4,5,6,7,8,9]
a.reduce(function(arr, n){
    if(n % 2 !== 0){
        arr.push(n)
    }
    return arr
},[]).reduce(function(sum, n){
    return sum + n
},0)

// 或者
a.reduce( (sum,n)=> {
    return n%2===1 ? sum + n : sum
}, 0)
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔓榄,一起剝皮案震驚了整個濱河市并炮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甥郑,老刑警劉巖逃魄,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異澜搅,居然都是意外死亡伍俘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門勉躺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來癌瘾,“玉大人,你說我怎么就攤上這事饵溅》镣耍” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咬荷。 經(jīng)常有香客問我冠句,道長,這世上最難降的妖魔是什么幸乒? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任轩端,我火速辦了婚禮,結(jié)果婚禮上逝变,老公的妹妹穿的比我還像新娘基茵。我一直安慰自己,他們只是感情好壳影,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布拱层。 她就那樣靜靜地躺著,像睡著了一般宴咧。 火紅的嫁衣襯著肌膚如雪根灯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天掺栅,我揣著相機與錄音烙肺,去河邊找鬼。 笑死氧卧,一個胖子當著我的面吹牛桃笙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沙绝,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼搏明,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了闪檬?” 一聲冷哼從身側(cè)響起星著,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎粗悯,沒想到半個月后虚循,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡样傍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年横缔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铭乾。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡剪廉,死狀恐怖娃循,靈堂內(nèi)的尸體忽然破棺而出炕檩,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布笛质,位于F島的核電站泉沾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏妇押。R本人自食惡果不足惜跷究,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望敲霍。 院中可真熱鬧俊马,春花似錦、人聲如沸肩杈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扩然。三九已至艘儒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間夫偶,已是汗流浹背界睁。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兵拢,地道東北人翻斟。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像说铃,于是被迫代替她去往敵國和親杨赤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

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

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,216評論 0 4
  • 概要 64學時 3.5學分 章節(jié)安排 電子商務網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,128評論 0 3
  • 第3章 基本概念 3.1 語法 3.2 關鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,106評論 0 21
  • Javascript有很多數(shù)組的方法截汪,有的人有W3C的API疾牲,還可以去MDN上去找,但是我覺得API上說的不全衙解,M...
    頑皮的雪狐七七閱讀 4,068評論 0 6
  • 本人有幸到大西北耍了一圈阳柔,隨手把夜拍了,天也拍了蚓峦,希望你們能喜歡(盡管拍照水平著實不高)舌剂。 我是勝之,希望我們都對...
    勝之king閱讀 162評論 0 1