數(shù)組的定義
除了在定義時賦值,數(shù)組也可以先定義后賦值。
任何類型的數(shù)據(jù)黔夭,都可以放入數(shù)組。
數(shù)組的本質(zhì)
本質(zhì)上羽嫡,數(shù)組屬于一種特殊的對象纠修。typeof運算符會返回數(shù)組的類型是object。
JavaScript語言規(guī)定厂僧,對象的鍵名一律為字符串,所以了牛,數(shù)組的鍵名其實也是字符串颜屠。之所以可以用數(shù)值讀取,是因為非字符串的鍵名會被轉(zhuǎn)為字符串鹰祸。
對象有兩種讀取成員的方法:“點”結(jié)構(gòu)(object.key)和方括號結(jié)構(gòu)(object[key])甫窟。
length屬性
數(shù)組的length屬性,返回數(shù)組的成員數(shù)量蛙婴。
1)只要是數(shù)組粗井,就一定有l(wèi)ength屬性。該屬性是一個動態(tài)的值街图,等于鍵名中的最大整數(shù)加上1浇衬。
2)length屬性是可寫的。如果人為設(shè)置一個小于當前成員個數(shù)的值餐济,該數(shù)組的成員會自動減少到length設(shè)置的值耘擂。所以 將數(shù)組清空的一個有效方法,就是將length屬性設(shè)為0絮姆。
3)值得注意的是醉冤,由于數(shù)組本質(zhì)上是對象的一種,所以我們可以為數(shù)組添加屬性篙悯,但是這不影響length屬性的值蚁阳。
let a = []
a.b = 'a'
a
b: "a"
length: 0 // length不變
__proto__: Array(0)
for…in 循環(huán)和數(shù)組的遍歷
for...in循環(huán)不僅可以遍歷對象,也可以遍歷數(shù)組鸽照,畢竟數(shù)組只是一種特殊對象螺捐。
不推薦使用for...in遍歷數(shù)組,因為會遍歷非數(shù)字鍵。
var a = [1, 2, 3];
for (var i in a) {
console.log(a[i]);
}
// 1
// 2
// 3
但是归粉,for...in不僅會遍歷數(shù)組所有的數(shù)字鍵椿疗,還會遍歷非數(shù)字鍵。
var a = [1, 2, 3];
a.foo = true;
for (var key in a) {
console.log(key);
}
// 0
// 1
// 2
// foo
數(shù)組的空位
1)數(shù)組的空位是可以讀取的糠悼,返回undefined届榄。
2)使用delete命令刪除一個數(shù)組成員,會形成空位倔喂,并且不會影響length屬性铝条。
let a = [1, , 1];
a.length // 3
let a = [, , ,];
a[1] // undefined
let a = [1, 2, 3];
delete a[1];
a[1] // undefined
a.length // 3
Array對象
Array作為構(gòu)造函數(shù),行為很不一致席噩。因此班缰,不建議使用它生成新數(shù)組,直接使用數(shù)組字面量是更好的做法悼枢。
1.構(gòu)造函數(shù)
Array是JavaScript的內(nèi)置對象埠忘,同時也是一個構(gòu)造函數(shù),可以用它生成新的數(shù)組馒索。
let arr = new Array(2);
arr.length // 2
arr // [ undefined , undefined ]
2.Array.isArray()
Array.isArray方法用來判斷一個值是否為數(shù)組莹妒。
var a = [1, 2, 3];
Array.isArray(a) // true
3.Array.from()
Array.from()方法將類數(shù)組轉(zhuǎn)化為數(shù)組
Array.from('foo') // [ "f", "o", "o" ]
let set = new Set(['foo', 'bar', 'baz', 'foo'])
Array.from(set) // [ "foo", "bar", "baz" ]
4.Array實例的方法
- valueOf方法返回數(shù)組本身
- toString方法返回數(shù)組的字符串形式
- push方法用于在數(shù)組的末端添加一個或多個元素,并返回添加新元素后的數(shù)組長度绰上。注意旨怠,該方法會改變原數(shù)組。
**( 返回新的數(shù)組長度蜈块,改變原數(shù)組 ) - unshift方法用于在數(shù)組的第一個位置添加元素鉴腻,并返回添加新元素后的數(shù)組長度。注意百揭,該方法會改變原數(shù)組爽哎。
**( 返回添加后新數(shù)組長度,改變原數(shù)組 ) - pop方法用于刪除數(shù)組的最后一個元素器一,并返回該元素倦青。注意,該方法會改變原數(shù)組盹舞。
**( 返回刪除的最后一個元素产镐,改變原數(shù)組 ) - shift方法用于刪除數(shù)組的第一個元素,并返回該元素踢步。注意癣亚,該方法會改變原數(shù)組。
**(返回刪除的第一個元素获印,改變元素組 ) - join方法以參數(shù)作為分隔符述雾,將所有數(shù)組成員組成一個字符串返回。如果不提供參數(shù),默認用逗號分隔玻孟。
**( 返回參數(shù)作為分隔符的字符串 唆缴,參數(shù)是分隔符 ) - concat方法用于多個數(shù)組的合并。它將新數(shù)組的成員黍翎,添加到原數(shù)組的尾部面徽,然后返回一個新數(shù)組,原數(shù)組不變匣掸。
**( 返回合并后的新數(shù)組 趟紊,不改變原數(shù)組 ) - reverse方法用于顛倒數(shù)組中元素的順序,返回改變后的數(shù)組碰酝。注意霎匈,該方法將改變原數(shù)組。
**( 返回改變后的數(shù)組送爸,改變原數(shù)組 ) - slice方法用于提取原數(shù)組的一部分铛嘱,返回一個提取的新數(shù)組,原數(shù)組不變袭厂。
**( 返回提取的新數(shù)組墨吓,不改變原數(shù)組 ) - splice方法用于刪除原數(shù)組的一部分成員,并可以在被刪除的位置添加入新的數(shù)組成員嵌器,返回值是被刪除的元素。注意谐丢,該方法會改變原數(shù)組澈侠。
**( 返回被刪出的元素鹿霸,改變原數(shù)組)
splice的第一個參數(shù)是 ( 刪除的起始位置 ),第二個參數(shù)是 ( 被刪除的元素個數(shù) )。如果后面還有更多的參數(shù)跟伏,則表示這些就是要被插入數(shù)組的新元素。
//刪除
let a = ['a', 'b', 'c', 'd', 'e', 'f'];
a.splice(4, 2) // ["e", "f"]
a // ["a", "b", "c", "d"]
//插入
let a = [1, 1, 1];
a.splice(1, 0, 2) // []
a // [1, 2, 1, 1]
- sort方法對數(shù)組成員進行排序瑰谜,默認是按照字典順序排序锌历。排序后,原數(shù)組將被改變蹄葱。( 排序氏义,改變原數(shù)組 )
如果想讓sort方法按照自定義方式排序,可以( 傳入一個函數(shù)作為參數(shù) )图云,表示按照自定義方法進行排序惯悠。該函數(shù)本身又接受兩個參數(shù),表示進行比較的兩個元素竣况。如果( 返回值 )大于0克婶,表示第一個元素排在第二個元素后面;其他情況下,都是第一個元素排在第二個元素前面情萤。
[10, 11, 9].sort(function (a, b) {
return a - b;
}) // [9, 10, 11]
- map方法對數(shù)組的所有成員依次調(diào)用一個函數(shù)鸭蛙,根據(jù)函數(shù)結(jié)果返回一個新數(shù)組。
**( 返回新數(shù)組 筋岛,不改變原數(shù)組 )
let numbers = [1, 2, 3];
numbers.map(function (n) {
return n + 1;
});
// [2, 3, 4]
- forEach方法與map方法很相似娶视,也是遍歷數(shù)組的所有成員,執(zhí)行某種操作泉蝌,但是forEach方法一般不返回值歇万,只用來操作數(shù)據(jù)。如果需要有返回值勋陪,一般使用map方法贪磺。
- filter方法的參數(shù)是一個函數(shù) ,所有數(shù)組成員依次執(zhí)行該函數(shù)诅愚,返回結(jié)果為true的成員組成一個新數(shù)組返回寒锚。該方法不會改變原數(shù)組。
**( 返回結(jié)果為true的成員組成的新數(shù)組违孝,不改變原數(shù)組 )
let a = [5, 12, 8, 130, 44];
let found = a.filter(element => element > 10) // [12, 130, 44]
- find方法與filter相似刹前,不同的是find返回的結(jié)果為第一返回結(jié)果為true的成員
let a = [5, 12, 8, 130, 44];
let found = a.find(element => element > 10) // 12
- some方法接受一個函數(shù)作為參數(shù),所有數(shù)組成員依次執(zhí)行該函數(shù)雌桑,返回一個布爾值喇喉。只要有一個數(shù)組成員的返回值是true,則整個some方法的返回值就是true校坑,否則false拣技。
let a = [5, 12, 8, 130, 44];
a.some(element => element > 10) // true
- every方法與some類似,some則是所有數(shù)組成員的返回值都是true耍目,才返回true膏斤,否則false。
let a = [5, 12, 8, 130, 44];
a.every(element => element > 10) // false
- indexOf方法返回給定元素在數(shù)組中第一次出現(xiàn)的位置邪驮,如果沒有出現(xiàn)則返回-1莫辨。
- lastIndexOf方法返回給定元素在數(shù)組中最后一次出現(xiàn)的位置,如果沒有出現(xiàn)則返回-1
- includes() 方法用來判斷一個數(shù)組是否包含一個指定的值毅访,根據(jù)情況沮榜,如果包含則返回 true,否則返回false敞映。
- flat() 方法會按照一個可指定的深度(指定要提取嵌套數(shù)組的結(jié)構(gòu)深度,默認值為 1)遞歸遍歷數(shù)組磷斧,并將所有元素與遍歷到的子數(shù)組中的元素合并為一個新數(shù)組返回(數(shù)組扁平化)
**( 返回扁平化的新數(shù)組捷犹,不改變原數(shù)組 )
let a = [0, 1, 2, [3, 4]]
a.flat() // [0, 1, 2, 3, 4]
// 如果不知道嵌套深度可指定參數(shù)為 Infinity
let a = [1,2,3,[1,2,3,4, [2],[3,4]]]
a.flat(Infinity) // [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]