數(shù)組
一.創(chuàng)建數(shù)組方式(3種)
1.創(chuàng)建字面量數(shù)組:var arr[];
2.創(chuàng)建數(shù)組對(duì)象
- new Array();
- new Array(size);
- new Array(element0,element1,.....,elementn)
3.根據(jù)對(duì)象創(chuàng)建數(shù)組:var arr=new Oject([]); //不用
注意: 數(shù)組是一個(gè)引用列表;列 表:順序,只有值,緊密,速度慢;
數(shù)組只有值得存儲(chǔ),只能遍歷數(shù)組獲取值是否存在;遍歷內(nèi)容較多,當(dāng)添加刪除元素時(shí),因?yàn)閿?shù)組緊密型,速度變慢,尤其前面插入和刪除
var arr=[1,2,3,4,5];
arr[7]=10; 數(shù)組的緊密型,如果中間空余,就會(huì)自動(dòng)補(bǔ)充空元素
console.log(arr);// [1, 2, 3, 4, 5, empty × 2, 10]
arr[-1]=10 插入到最后
二.數(shù)組屬性
- length 設(shè)置或返回?cái)?shù)組中元素的數(shù)目。
- length也是可以設(shè)置的,如果設(shè)置為0,表示清空數(shù)組,如果設(shè)置為3,表示保留到第三位
例如:arr.length=0; //表示清空數(shù)組
arr.length=-2;//錯(cuò)誤數(shù)組長(zhǎng)度不能為負(fù)值
arr.length="a";//如果給的不是數(shù)值,會(huì)隱式轉(zhuǎn)換為數(shù)值,如果值是NaN,就會(huì)報(bào)錯(cuò)(字符串中如果有字符存在,轉(zhuǎn)換數(shù)據(jù)類(lèi)型變?yōu)镹aN)
三.數(shù)組的方法
- push()和pop()
push()方法:在數(shù)組尾部添加一個(gè)或多個(gè)新元素,并且返回?cái)?shù)組的新長(zhǎng)度
var arr=[1,2,3];
arr.push(5,6,7);
console.log(arr);//[1, 2, 3, 5, 6, 7]
pop()方法:刪除數(shù)組的尾部元素,并且返回這個(gè)被刪除的元素
var arr=[1,2,3];
var item=arr.pop();
console.log(item,arr);//3 >(2) [1, 2]
注意: 兩個(gè)方法都修改并替換原始數(shù)組而非生成一個(gè)修改版的新數(shù)組。
- unshift()和shift()
unshift() 將一個(gè)或者多個(gè)新元素添加在數(shù)組的最前面,返回?cái)?shù)組的新長(zhǎng)度
var arr=[1,2,3];
a=arr.unshift(5,[6,7],8);
console.log(arr,a);//運(yùn)行結(jié)果如下

shift(); 刪除數(shù)組的第一個(gè)元素,并且返回該元素
var arr=[1,2,3,4];
item=arr.shift();
console.log(arr,item);//[2, 3] 1
- concat()和join()
concat()方法:創(chuàng)建并返回一個(gè)新數(shù)組,它的元素包括調(diào)用concat()的原數(shù)組的元素和concat()的每個(gè)參數(shù)。如果這些參數(shù)中的任何一個(gè)自身是數(shù)組,則連接的是數(shù)組的元素,而非數(shù)組本身。
注意: concat()不會(huì)遞歸扁平化數(shù)組的數(shù)組。concat()也不會(huì)修改調(diào)用的數(shù)組。
案列
var a=[1,2,3];
a.concat(4,5); //返回[1,2,3,4,5]
a.concat([4,5]); //返回[1,2,3,4,5]
a.concat([4,5],[6,7]); //返回[1,2,3,4,5,6,7]
a.concat(4,[5,[6,7]]); //返回[1,2,3,4,5,[6,7]]
join()方法:將數(shù)組中的所有元素都轉(zhuǎn)化為字符串并連接在一起,返回最后生成的字符串。可以指定一個(gè)可選的字符串在生成的字符串中來(lái)分隔數(shù)組中的個(gè)元素,如果不指定分隔符,默認(rèn)使用逗號(hào)。
var a=[1,2,3];
a.join(); //返回"1,2,3"
a.join(" "); //返回"1 2 3"
a.join(""); //返回"123"
a.join(); //返回"1,2,3"
var b=new Array(10);
b.join('-')//'---------':9個(gè)連字號(hào)組成的字符串
- splice()和slice()
splice()方法:第一個(gè)參數(shù)插入或刪除的起始位置,第二個(gè)參數(shù)指定了應(yīng)該從數(shù)組中刪除的元素的個(gè)數(shù)。并返回一個(gè)由刪除元素組成的數(shù)組,或者如果沒(méi)有刪除元素就返回一個(gè)空數(shù)組。
注意: 會(huì)改變?cè)瓟?shù)組
var arr=[1,3,5,7,9,2,4,6,8,10];
var arr1=arr.splice(2,0,12,14);//插入元素13,14,插入在第二位
console.log(arr,arr1);//[1, 3, 12, 14, 5, 7, 9, 2, 4, 6, 8, 10] []
var arr1=arr.splice(2,2,12,14);//替換元素,刪除兩位并且插入12,14 [1, 3, 12, 14, 5, 7, 9, 2, 4, 6, 8, 10] [12, 14]
console.log(arr,arr1)
slice(從什么位置開(kāi)始,截取到什么位置之前);//返回一個(gè)新數(shù)組,原數(shù)組不改變
var a = [1,2,3,4,5];
a.slice(0,3); //返回[1,2,3]
a.slice(3); //[4,5]
a.slice(1,-1);//[2,3,4]
a.slice(-3,-2);//[3]
- indexOf()和lastIndexOf()
indexOf()方法:arr.indexOf(要查找的元素,從第幾位開(kāi)始查找被包含);查
找元素在數(shù)組中的下標(biāo),如果沒(méi)有查找到返回-1
lastIndexOf()方法: 從后向前查找,
lastIndexOf(要查找的元素,從第幾位開(kāi)始查找被包含);
- forEach()
forEach()方法:從頭到尾遍歷數(shù)組,為每個(gè)元素調(diào)用指定的函數(shù),傳遞的函數(shù)作為forEach()的第一個(gè)參數(shù)。然后forEach()使用三個(gè)參數(shù)調(diào)用該函數(shù):數(shù)組元素、元素的索引和數(shù)組本身。
注意: forEach()無(wú)法在所有元素都傳遞給調(diào)用的函數(shù)之前終止遍歷。forEach不能返回任何內(nèi)容。forEach()不遍歷空元素,也不遍歷屬性。
var arr=[2,4,6,8,10,,12,14,16,18,20];
arr.a=10;
// forEach不遍歷空元素,也不遍歷屬性
// forEach是匿名函數(shù),無(wú)法阻止它在循環(huán)中斷循環(huán)跳出
arr.forEach(function(item,index,a){
console.log(item,index,a);//打印結(jié)果如下圖
});
重構(gòu)forEach方法
function forEach(arr,fn){
for(var i=0;i<arr.length;i++){
if(arr[i]===undefined) continue;
fn(arr[i],i,arr);
}
}
// 橋接模式
forEach(arr,function(item,index,a){
console.log(item,index,a);
})
- map()
map()方法:將調(diào)用的數(shù)組的元素傳遞給指定的函數(shù),并返回一個(gè)數(shù)組,它包含該函數(shù)的返回值。
例如:a=[1,2,3];
b=a.map(function(x){return x*x;}); //b是[1,4,9]
注意: map()返回的是新數(shù)組,不修改調(diào)用的數(shù)組。如果是稀疏數(shù)組,返回的也是相同方式的稀疏數(shù)組,它具有相同的長(zhǎng)度,相同的缺失元素。
- some()和every()
some()方法:遍歷數(shù)組,查找是否有滿(mǎn)足條件(返回的結(jié)果如果是true,)就直接跳出遍歷,返回true。
var arr=[1,2,3,4,5,6];
var bool=arr.some(function(item,index,a){
return item>4;
})
console.log(bool);//true
every()方法:判斷每一個(gè)是否都滿(mǎn)足條件,如果有一個(gè)返回的結(jié)果是false,直接返回false。
var arr=[1,2,3,4,5,6];
var bool=arr.every(function(item){
return item>4;
});
console.log(bool);//返回false
- filter()
filter()方法:創(chuàng)建一個(gè)新數(shù)組,其中包含所提供函數(shù)實(shí)現(xiàn)的測(cè)試的所有元素。
注意: filter()會(huì)跳過(guò)稀疏數(shù)組中缺少的元素,他返回?cái)?shù)組總是稠密的。
var arr=[1,2,3,4,5,6,7];
var arr1=arr.filter(function(item,index,a){
return item>4;
});
console.log(arr1);//[5, 6, 7]
- reduce()
reduce()方法:歸并 arr.reduce(function(上次歸并值,本次遍歷的元素,索引值,數(shù)組),初始化值);
如果沒(méi)有設(shè)置初始化值,上次歸并值初始值為數(shù)組的第0項(xiàng),本次遍歷將從下標(biāo)1開(kāi)始
如果設(shè)置了初始化值,上次歸并值初始值就是初始化值,本次遍歷將從下標(biāo)0開(kāi)始
var arr=[1,2,3,4,5];
var sum= arr.reduce(function(value,item,index,a){
console.log(value,item);
return value+item;
},100);
console.log(sum); //結(jié)果如下圖

- sort()
sort()方法:用于對(duì)數(shù)組的元素進(jìn)行排序,并返回?cái)?shù)組。默認(rèn)排序順序是根據(jù)字符串UniCode碼。因?yàn)榕判蚴前凑兆址甎niCode碼的順序進(jìn)行排序的,所以首先應(yīng)該把數(shù)組元素都轉(zhuǎn)化成字符串(如有必要),以便進(jìn)行比較。
語(yǔ)法:arrayObject.sort(sortby);
例一:按照字母順序排序

例二:還是按照字母進(jìn)行排序

如果要得到自己想要的結(jié)果,不管是升序還是降序,就需要提供比較函數(shù)了。該函數(shù)比較兩個(gè)值的大小,然后返回一個(gè)用于說(shuō)明這兩個(gè)值的相對(duì)順序的數(shù)字。
比較函數(shù)應(yīng)該具有兩個(gè)參數(shù) a 和 b,其返回值如下:
若 a 小于 b,即 a - b 小于零,則返回一個(gè)小于零的值,數(shù)組將按照升序排列。
若 a 等于 b,則返回 0。
若 a 大于 b, 即 a - b 大于零,則返回一個(gè)大于零的值,數(shù)組將按照降序排列。
例三:升序排列

例四:降序排序

- reverse()
reverse倒序,不排序,原數(shù)組改變,返回原數(shù)組;
var arr=[1,4,6,2,3,8,7,6,5,3,9];
arr.reverse();
console.log(arr);//9, 3, 5, 6, 7, 8, 3, 2, 6, 4, 1]