數(shù)組
一.創(chuàng)建數(shù)組方式(3種)
1.創(chuàng)建字面量數(shù)組:var arr[];
2.創(chuàng)建數(shù)組對象
- new Array();
- new Array(size);
- new Array(element0,element1,.....,elementn)
3.根據(jù)對象創(chuàng)建數(shù)組:var arr=new Oject([]); //不用
注意: 數(shù)組是一個引用列表亥鸠;列 表:順序僧免,只有值七兜,緊密孽糖,速度慢;
數(shù)組只有值得存儲渴语,只能遍歷數(shù)組獲取值是否存在;遍歷內(nèi)容較多苹威,當(dāng)添加刪除元素時,因為數(shù)組緊密型驾凶,速度變慢牙甫,尤其前面插入和刪除
var arr=[1,2,3,4,5];
arr[7]=10; 數(shù)組的緊密型,如果中間空余调违,就會自動補充空元素
console.log(arr);// [1, 2, 3, 4, 5, empty × 2, 10]
arr[-1]=10 插入到最后
二.數(shù)組屬性
- length 設(shè)置或返回數(shù)組中元素的數(shù)目窟哺。
- length也是可以設(shè)置的,如果設(shè)置為0技肩,表示清空數(shù)組且轨,如果設(shè)置為3,表示保留到第三位
例如:arr.length=0; //表示清空數(shù)組
arr.length=-2;//錯誤數(shù)組長度不能為負(fù)值
arr.length="a";//如果給的不是數(shù)值,會隱式轉(zhuǎn)換為數(shù)值旋奢,如果值是NaN泳挥,就會報錯(字符串中如果有字符存在,轉(zhuǎn)換數(shù)據(jù)類型變?yōu)镹aN)
三.數(shù)組的方法
- push()和pop()
push()方法:在數(shù)組尾部添加一個或多個新元素至朗,并且返回數(shù)組的新長度
var arr=[1,2,3];
arr.push(5,6,7);
console.log(arr);//[1, 2, 3, 5, 6, 7]
pop()方法:刪除數(shù)組的尾部元素屉符,并且返回這個被刪除的元素
var arr=[1,2,3];
var item=arr.pop();
console.log(item,arr);//3 >(2) [1, 2]
注意: 兩個方法都修改并替換原始數(shù)組而非生成一個修改版的新數(shù)組。
- unshift()和shift()
unshift() 將一個或者多個新元素添加在數(shù)組的最前面锹引,返回數(shù)組的新長度
var arr=[1,2,3];
a=arr.unshift(5,[6,7],8);
console.log(arr,a);//運行結(jié)果如下
shift(); 刪除數(shù)組的第一個元素矗钟,并且返回該元素
var arr=[1,2,3,4];
item=arr.shift();
console.log(arr,item);//[2, 3] 1
- concat()和join()
concat()方法:創(chuàng)建并返回一個新數(shù)組,它的元素包括調(diào)用concat()的原數(shù)組的元素和concat()的每個參數(shù)嫌变。如果這些參數(shù)中的任何一個自身是數(shù)組吨艇,則連接的是數(shù)組的元素,而非數(shù)組本身初澎。
注意: concat()不會遞歸扁平化數(shù)組的數(shù)組秸应。concat()也不會修改調(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)化為字符串并連接在一起凡蚜,返回最后生成的字符串】源樱可以指定一個可選的字符串在生成的字符串中來分隔數(shù)組中的個元素朝蜘,如果不指定分隔符,默認(rèn)使用逗號涩金。
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個連字號組成的字符串
- splice()和slice()
splice()方法:第一個參數(shù)插入或刪除的起始位置谱醇,第二個參數(shù)指定了應(yīng)該從數(shù)組中刪除的元素的個數(shù)暇仲。并返回一個由刪除元素組成的數(shù)組,或者如果沒有刪除元素就返回一個空數(shù)組枣抱。
注意: 會改變原數(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(從什么位置開始,截取到什么位置之前);//返回一個新數(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(要查找的元素,從第幾位開始查找被包含);查
找元素在數(shù)組中的下標(biāo),如果沒有查找到返回-1
lastIndexOf()方法: 從后向前查找中跌,
lastIndexOf(要查找的元素,從第幾位開始查找被包含);
- forEach()
forEach()方法:從頭到尾遍歷數(shù)組,為每個元素調(diào)用指定的函數(shù)菇篡,傳遞的函數(shù)作為forEach()的第一個參數(shù)漩符。然后forEach()使用三個參數(shù)調(diào)用該函數(shù):數(shù)組元素、元素的索引和數(shù)組本身驱还。
注意: forEach()無法在所有元素都傳遞給調(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ù)咐容,無法阻止它在循環(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ù)舆逃,并返回一個數(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ù)組奄妨,它具有相同的長度,相同的缺失元素苹祟。
- some()和every()
some()方法:遍歷數(shù)組砸抛,查找是否有滿足條件(返回的結(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()方法:判斷每一個是否都滿足條件柳骄,如果有一個返回的結(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)建一個新數(shù)組耐薯,其中包含所提供函數(shù)實現(xiàn)的測試的所有元素舔清。
注意: filter()會跳過稀疏數(shù)組中缺少的元素丝里,他返回數(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ù)組),初始化值)抒痒;
如果沒有設(shè)置初始化值幌绍,上次歸并值初始值為數(shù)組的第0項,本次遍歷將從下標(biāo)1開始
如果設(shè)置了初始化值故响,上次歸并值初始值就是初始化值傀广,本次遍歷將從下標(biāo)0開始
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()方法:用于對數(shù)組的元素進(jìn)行排序,并返回數(shù)組彩届。默認(rèn)排序順序是根據(jù)字符串UniCode碼伪冰。因為排序是按照字符串UniCode碼的順序進(jìn)行排序的,所以首先應(yīng)該把數(shù)組元素都轉(zhuǎn)化成字符串(如有必要)樟蠕,以便進(jìn)行比較贮聂。
語法:arrayObject.sort(sortby);
例一:按照字母順序排序
例二:還是按照字母進(jìn)行排序
如果要得到自己想要的結(jié)果,不管是升序還是降序寨辩,就需要提供比較函數(shù)了吓懈。該函數(shù)比較兩個值的大小,然后返回一個用于說明這兩個值的相對順序的數(shù)字捣染。
比較函數(shù)應(yīng)該具有兩個參數(shù) a 和 b骄瓣,其返回值如下:
若 a 小于 b,即 a - b 小于零耍攘,則返回一個小于零的值榕栏,數(shù)組將按照升序排列。
若 a 等于 b蕾各,則返回 0扒磁。
若 a 大于 b, 即 a - b 大于零,則返回一個大于零的值式曲,數(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]