Array數(shù)組
創(chuàng)建數(shù)組的兩種方式:
- 使用Array構(gòu)造函數(shù)
var colors = new Array()
,new
操作符可省略
給構(gòu)造函數(shù)傳遞一個(gè)值的話(huà),若為數(shù)值,則該值為新數(shù)組的長(zhǎng)度呼奢;若為其他類(lèi)型,則該值為新數(shù)組的第一個(gè)元素,且數(shù)組長(zhǎng)度為1固额。
var colors = new Array(3); //創(chuàng)建一個(gè)包含3項(xiàng)的數(shù)組,值都為undefined
var colors = new Array("liyang"); //創(chuàng)建一個(gè)包含1項(xiàng)煞聪,即字符串'liyang'的數(shù)組
根據(jù)此特性創(chuàng)建一個(gè)重復(fù)某字符串n次的方法:
function repeatString(str,n){
return new Array(n+1).join(str); //創(chuàng)建一個(gè)長(zhǎng)度為n+1的空數(shù)組对雪,使用str來(lái)連接這個(gè)空數(shù)組的元素,即undefined
}
repeatString("a",4); // 返回 "aaaa"
repeatString("3",3); //返回 "333"
- 使用數(shù)組字面量表示法
var colors = ['red','yellow','green'];
var values = [1,2,]; //不推薦,IE8及以下會(huì)視為長(zhǎng)度為3米绕,最后一個(gè)值為undefined
var options = [,,,]; //不推薦瑟捣,IE8會(huì)視為長(zhǎng)度為4,值都是undefined
直接給Array
的length賦一個(gè)新的值會(huì)導(dǎo)致Array
大小的變化;
Array
可以通過(guò)索引把對(duì)應(yīng)的元素修改為新的值;
如果通過(guò)索引賦值時(shí)栅干,索引超過(guò)了范圍迈套,同樣會(huì)引起Array
大小的變化
檢測(cè)數(shù)組
- value instanceof Array 執(zhí)行環(huán)境會(huì)對(duì)其判斷有影響
- ECMAScript5新增的方法
Array.isArray()
來(lái)確定某個(gè)值到底是不是數(shù)組
轉(zhuǎn)換方法
所有對(duì)象都有 toLocaleString()、toString()和valueOf()方法碱鳞,數(shù)組的調(diào)用如下:
-
toString()
:返回由數(shù)組中每個(gè)值的字符串形式拼接而成的一個(gè)以逗號(hào)分隔的字符串
桑李; -
toLocaleString()
:同樣返回一個(gè)逗號(hào)分隔的字符串,不同在于會(huì)調(diào)用數(shù)組每一項(xiàng)的toLocaleString()方法窿给,而不是toString()方法贵白; -
valueOf()
: 返回?cái)?shù)組;
shift,unshift和push,pop
-
shift()
方法刪除Array
的第一個(gè)元素崩泡,返回的是刪掉的元素 -
unshift()
方法向Array
的頭部添加若干值禁荒,返回的是新數(shù)組的長(zhǎng)度 -
push()
方法向Array
的尾部添加若干值,返回的是新數(shù)組的長(zhǎng)度 -
pop()
方法刪除Array
的最后一個(gè)元素角撞,返回的是刪掉的元素
var arr = [1,2,3,4];
arr.shift(); // 返回'1'
arr; // [2,3,4]
arr.unshift('a','b'); //返回 5
arr; //['a','b','2','3','4']
arr.push('c','d'); //返回 7
arr; //['a','b','2','3','4','c','d']
arr.pop(); //返回 'd'
arr; //['a','b','2','3','4','c']
reverse和sort
-
reverse()
方法用于反轉(zhuǎn)數(shù)組項(xiàng)的順序 -
sort()
方法用于排序數(shù)組呛伴,默認(rèn)按照升序排序
sort()
方法會(huì)調(diào)用每個(gè)數(shù)組項(xiàng)的toString()
方法,然后比較字符串進(jìn)行排序谒所,可以接受一個(gè)比較函數(shù)作為參數(shù)热康。
var arr = [13,15,5,2,6];
arr.sort();
arr; //[13,15,2,5,6]
arr.sort(function(a,b){
return a - b; //升序
});
arr; //[2,5,6,13,15]
arr.sort(function(a,b){
return b - a; //降序
});
arr; //[15,13,6,5,2]
slice和splice
-
slice()
方法截取數(shù)組的部分元素,根據(jù)索引來(lái)截取劣领。對(duì)應(yīng)字符串的substring()
方法 -
splice()
方法可以從指定的索引處開(kāi)始刪除n個(gè)元素姐军,然后再?gòu)脑撐恢锰砑觤個(gè)元素,是數(shù)組的萬(wàn)能方法
var arr = ['red','yellow','green','blue'];
arr.slice(1,3); //從1開(kāi)始截取到3,不包括3奕锌。返回截取的數(shù)組['yellow','green']
arr; //數(shù)組本身不變:['red','yellow','green','blue']
var arr2 = ['red','yellow','green','blue'];
arr2.slice(2); //從索引2開(kāi)始到結(jié)束衫贬。['green','blue']
arr2; //數(shù)組本身不變:['red','yellow','green','blue']
var arr3 = ['red','yellow','green','blue'];
var copy = arr3.slice(); //不傳值相當(dāng)于復(fù)制數(shù)組
copy; //返回:['red','yellow','green','blue']
copy === arr; // false
var arr4 = ['red','yellow','green','blue'];
arr4.slice(1,-1); // ['yellow','green'] -1索引指最后一個(gè)元素,-2指倒數(shù)第二個(gè)
---------------
var arr1 = ['a','b','c','d'];
//從索引2開(kāi)始刪除1個(gè)元素歇攻,然后再添加兩個(gè)元素
arr1.splice(2,1,'red','yellow'); //返回刪除的元素['c']
arr1; // ['a','b','red','yellow','d']
//只刪除固惯,不添加
arr1.splice(1,2); //返回刪除的元素?cái)?shù)組 ['b','red']
arr1; // ['a','yellow','d']
//只添加,不刪除
arr1.splice(1,0,'green'); //返回空[],因?yàn)闆](méi)有刪除元素
arr1; // ['a','green','yellow','d'] 注意是在索引1的<前面>添加新元素
concat和join
-
concat()
方法把當(dāng)前的Array和另一個(gè)Array連接起來(lái)缴守,返回一個(gè)新的數(shù)組 -
join()
方法把當(dāng)前Array的每個(gè)元素都用指定的字符串連接起來(lái)葬毫,然后返回連接后的字符串
var arr = ['a','b','c'];
var added = arr.concat([1,2,3]);
added; // ['a','b','c',1,2,3]
arr; //['a','b','c'] 原數(shù)組并未改變
arr.concat([1,2],3); // ['a','b','c',1,2,3] 數(shù)組元素會(huì)被拉平
arr.concat([1,2,[3,4]]); // ['a','b','c',1,2,[3,4]] 多重?cái)?shù)組不會(huì)被拉平
var arr2 = ['a','b','c',1,3]
arr.join('-'); //返回字符串 a-b-c-1-3
arr; //['a','b','c',1,3] 原數(shù)組并未改變
arr.toString(); //返回字符串 a,b,c,1,3
arr.join(','); //返回字符串 a,b,c,1,3 同toString()方法
indexOf和lastIndexOf
兩者都接收兩個(gè)參數(shù):要查找的項(xiàng)和表示查找地點(diǎn)的索引(可選);indexOf()從數(shù)組開(kāi)頭開(kāi)始向后查找屡穗,lastIndexOf()從數(shù)組的末尾向前查找贴捡。若查找的項(xiàng)沒(méi)找到則返回-1
var arr = [1,2,3,2,1];
arr.indexOf(2); //1
arr.indexOf(99); //-1
arr.indexOf(1,1); //4
arr.indexOf(1,-3); //4
arr.indexOf(2,-1); //-1
arr.lastIndexOf(2); //3
arr.lastIndexOf(2,-2) //3
arr.lastIndexOf(2,-3) //1
數(shù)組的迭代方法
ECMAScript5定義了5個(gè)數(shù)組的迭代方法,每個(gè)方法都接收2個(gè)參數(shù):要在每一項(xiàng)上運(yùn)行的函數(shù)和運(yùn)行該函數(shù)的作用域?qū)ο?影響this的值(可選)。 函數(shù)會(huì)接收3個(gè)參數(shù):數(shù)組項(xiàng)的值item村砂,item項(xiàng)的索引index和該數(shù)組對(duì)象本身烂斋。
every()和some()
every()
:數(shù)組中每一項(xiàng)運(yùn)行函數(shù),都返回true础废,才返回true汛骂。
some()
:數(shù)組中每一項(xiàng)運(yùn)行函數(shù),有一項(xiàng)返回true评腺,就返回true帘瞭。
filter()
數(shù)組中每一項(xiàng)運(yùn)行函數(shù),返回 函數(shù)運(yùn)行為true的項(xiàng) 組成的數(shù)組蒿讥。
map()
數(shù)組中每一項(xiàng)運(yùn)行函數(shù)蝶念,返回 每次調(diào)用函數(shù)返回的值 組成的數(shù)組,跟原數(shù)組一一對(duì)應(yīng)芋绸。
forEach()
對(duì)數(shù)組中每一項(xiàng)運(yùn)行函數(shù)媒殉,沒(méi)有返回值
數(shù)組的歸并方法
reduce()和reduceRight()
ECMAScript5定義了2個(gè)數(shù)組的歸并方法,每個(gè)方法都接收2個(gè)參數(shù):在每一項(xiàng)調(diào)用的值和作為歸并的初始值(可選)摔敛。 函數(shù)會(huì)接收4個(gè)參數(shù):前一個(gè)值廷蓉,當(dāng)前值,項(xiàng)的索引和數(shù)組對(duì)象本身舷夺。這個(gè)函數(shù)的返回值會(huì)作為第一個(gè)參數(shù)自動(dòng)傳個(gè)下一項(xiàng)苦酱。 第一次迭代發(fā)生在數(shù)組第二項(xiàng)上售貌,因此第一個(gè)參數(shù)是數(shù)組第一項(xiàng)给猾,第二個(gè)參數(shù)是數(shù)組第二項(xiàng)。
var values = [1,2,3,4,5];
var sum = values.reduce(function(prev,cur,index,array){
return prev + cur;
});
sum; // 15
第一次執(zhí)行回調(diào)函數(shù)颂跨,prev是1敢伸,cur是2。第二次執(zhí)行恒削,prev是返回值3池颈,cur是第三項(xiàng)3尾序。過(guò)程直至數(shù)組最后一項(xiàng)。
var values = [1,2,3,4,5];
var sum = values.reduce(function(prev,cur,index,array){
return prev + cur;
},6);
sum; // 21
若傳入第二個(gè)參數(shù)作為初始值(可為任意值)躯砰,則第一次prev是6每币,cur是數(shù)組第一項(xiàng)1。
reduceRight()是反過(guò)來(lái)從最后開(kāi)始執(zhí)行琢歇。