一岸售、數(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ù)辖源。
- 基本用法蔚携,以下三種寫法都可以:
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)建的都是對象亡脑。
- 創(chuàng)建空數(shù)組:
var a = new Array(3)
a // [empty * 3]
a.length // 3
Array 構(gòu)造函數(shù)的參數(shù) 3堕澄,表示生成一個長度為 3 的數(shù)組,每個位置都是空值:- 不一致性
var a = new Array(3, 3)
// [3, 3]
上面的例子远豺,第一個參數(shù)不再指數(shù)組的長度奈偏,說明 Array 作為構(gòu)造函數(shù)具有不一致性。內(nèi)存圖解:2. JS 中數(shù)組的本質(zhì)
- 我們對數(shù)組的理解:數(shù)組就是數(shù)據(jù)的有序集合躯护。
JS 對數(shù)組的理解:數(shù)組就是原型鏈中有Array.prototype
的對象惊来。
- Array 既有
valueOf()
,toString()
等所有對象都擁有的靜態(tài)方法棺滞,還有push()
裁蚁、pop()
、shift()
继准、join()
等 Array 獨有的方法(Array.prototype
)枉证。
- Array 與 Object 的區(qū)別
var a = [1,2,3]
var obj = {0:1, 1:2, 2:3, length:3}
二者的內(nèi)存是沒有區(qū)別的,它們的區(qū)別是原型不同移必。內(nèi)存圖解:3. 偽數(shù)組
- 定義:一個對象室谚,有
0,1,2,3,4,5...n,length
這些key
,但原型鏈中沒有Array.prototype
崔泵,這樣的對象就是偽數(shù)組秒赤。 - 目前知道的偽數(shù)組有
arguments
對象
document.querySelectAll('div')
返回的對象
4. 數(shù)組的 API
API:瀏覽器提供的接口。
- Array.prototype.forEach:遍歷
-
forEach()
方法對數(shù)組的所有成員依次執(zhí)行參數(shù)函數(shù)憎瘸。forEach()
方法的參數(shù)是一個函數(shù)入篮,該函數(shù)接受三個參數(shù):當前值value
、當前位置key
幌甘、整個數(shù)組潮售。 - 它不返回值,只用來操作數(shù)據(jù)锅风。
arr.forEach( function(){} )
-
for i
循環(huán)和Array.prototype.forEach
都可以遍歷數(shù)組酥诽,二者區(qū)別為:
for
是關鍵字,不是函數(shù)皱埠;Array.prototype.forEach
是一個函數(shù)盆均。
for
循環(huán)可以break
和continue
;Array.prototype.forEach
不支持break
和continue
.
-
Array.prototype.sort:排序
sort()
方法的內(nèi)置排序一般是快排漱逸。排序后泪姨,原數(shù)組被改變游沿。
默認按照字典順序排序,若想自定義排序肮砾,可傳入一個函數(shù)作為參數(shù)诀黍。
- 返回 (x-y)和返回(y-x)的排序結(jié)果是不同的,一個從小到大排序仗处,一個從大到小排序眯勾。
-
Array.prototype.join:連接數(shù)組成員為字符串
join()
方法以指定參數(shù)作為分隔符,將所有數(shù)組成員連接成一個字符串婆誓。
如果不提供參數(shù)吃环,默認用逗號分隔。
-
Array.prototype.concat:合并多個數(shù)組
concat()
方法用于多個數(shù)組的合并洋幻。將新數(shù)組的成員添加到原數(shù)組成員的后部郁轻,然后返回一個新數(shù)組,原數(shù)組不變文留。
- 特殊用法:用來復制一個數(shù)組好唯。把當前數(shù)組
concat
一個空數(shù)組[]
,返回一個新的數(shù)組燥翅。
- 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ù)組本身凛膏。
- Array.prototype.filter:過濾
-
filter()
方法用于過濾數(shù)組成員杨名,滿足條件的成員組成一個新數(shù)組返回。 - 它的參數(shù)是一個函數(shù)译柏,所有數(shù)組成員依次執(zhí)行該函數(shù)镣煮,返回結(jié)果為
true
的成員組成一個新數(shù)組返回姐霍。該方法不會改變原數(shù)組鄙麦。
-
鏈式操作,同時使用
filter
和map
方法:
-
Array.prototype.reduce
reduce()
方法從左到右依次處理數(shù)組的每個成員(從第一個成員到最后一個成員)镊折,最終累計為一個值胯府。
reduce
方法求出數(shù)組所有成員的和恨胚。第一個參數(shù)是一個函數(shù)骂因,sum 為之前求和的結(jié)果,n 為當前數(shù)字赃泡,最后一個參數(shù) 0 是初始值寒波。
-
map
和filter
用reduce
表示:
-
Array.prototype.reverse:顛倒
reverse()
方法用于顛倒排列數(shù)組元素乘盼,返回改變后的數(shù)組。該方法會改變原數(shù)組俄烁。
Array.prototype.slice:提取
-
slice()
方法用于提取目標數(shù)組的一部分绸栅,返回一個新數(shù)組,原數(shù)組不變页屠。
arr.slice(start, end)
-
它的第一個參數(shù)為起始位置(從 0 開始)粹胯,第二個參數(shù)為終止位置(不包含該位置的元素本身)。如果省略第二個參數(shù)辰企,則一直返回到原數(shù)組的最后一個成員风纠。
- 特殊用法:最后一個例子
slice
沒有參數(shù),實際上等于返回一個原數(shù)組的拷貝牢贸。
- Array.prototype.splice:刪除
-
splice()
方法用于刪除原數(shù)組的一部分成員竹观,并可以在刪除的位置添加新的數(shù)組成員,返回值是被刪除的元素十减。該方法會改變原數(shù)組栈幸。
arr.splice(start, count, addElement1, addElement2, ...)
-
splice
的第一個參數(shù)是刪除的起始位置(從0開始),第二個參數(shù)是被刪除的元素個數(shù)帮辟。如果后面還有更多的參數(shù)速址,則表示這些就是要被插入數(shù)組的新元素。
-
如果只提供第一個參數(shù)由驹,等同于將原數(shù)組在指定位置拆分成兩個數(shù)組:
- 例題: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)