forEach
myArray.forEach(function(value){ console.log(value);});
實際上forEach有三個參數(shù)? 分別為? 值? 下標(biāo)? 數(shù)組本身 于是我們有
[].forEach(function(value, index, array) {
});
forEach只是對數(shù)組中的每一項運行傳入的函數(shù)锅知,這個方法沒有返回值阔拳,對原來數(shù)組也沒有影響口锭,但是我們可以自己通過數(shù)組的索引來修改原來的數(shù)組,本質(zhì)上與for迭代數(shù)組一樣裂七。forEach不好用?你不能使用break語句中斷循環(huán),也不能使用return語句返回到外層函數(shù)仓坞。
兼容性寫法:
/**
* forEach遍歷數(shù)組
* @param callback [function] 回調(diào)函數(shù)背零;
* @param context [object] 上下文;
*/
Array.prototype.myForEach =functionmyForEach(callback,context){
????????context = context || window;
????????if('forEach'inArray.prototye) {
????????this.forEach(callback,context);
????????return;
????????}
????//IE6-8下自己編寫回調(diào)函數(shù)執(zhí)行的邏輯
????for(vari = 0,len =this.length; i < len;i++) {
????????callback && callback.call(context,this[i],i,this);
????}
}
map
varary = [12,23,24,42,1];
varres = ary.map(function(item,index,input) {
returnitem*10;
})
console.log(res);//-->[120,230,240,420,10];
console.log(ary);//-->[12,23,24,42,1]
map和forEach非常相似无埃,都是用來遍歷數(shù)組中的每一項值的徙瓶,用來遍歷數(shù)組中的每一項;
map的回調(diào)函數(shù)中支持return返回值嫉称;return的是啥侦镇,相當(dāng)于把數(shù)組中的這一項變?yōu)樯叮ú⒉挥绊懺瓉淼臄?shù)組,只是相當(dāng)于把原數(shù)組克隆一份织阅,把克隆的這一份的數(shù)組中的對應(yīng)項改變了)壳繁;
不管是forEach還是map 都支持第二個參數(shù)值,第二個參數(shù)的意思是把匿名回調(diào)函數(shù)中的this進行修改荔棉。
兼容性寫法:
/**
* map遍歷數(shù)組
* @param callback [function] 回調(diào)函數(shù)闹炉;
* @param context [object] 上下文;
*/
Array.prototype.myMap =functionmyMap(callback,context){
????????context = context || window;
????????if('map'inArray.prototye) {
????????returnthis.map(callback,context);
????}
????//IE6-8下自己編寫回調(diào)函數(shù)執(zhí)行的邏輯
????varnewAry = [];
????for(vari = 0,len =this.length; i < len;i++) {
????????if(typeofcallback ==='function') {
????????varval = callback.call(context,this[i],i,this);
????????newAry[newAry.length] = val;
????????}
????}
returnnewAry;
}
filter():
語法:
varfilteredArray = array.filter(callback[, thisObject]);
參數(shù)說明:
callback:?要對每個數(shù)組元素執(zhí)行的回調(diào)函數(shù)江耀。
thisObject :?在執(zhí)行回調(diào)函數(shù)時定義的this對象剩胁。
//過濾掉小于 10 的數(shù)組元素:
//代碼:
function isBigEnough(element, index, array) {
return (element >= 10);
}
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
// 12, 130, 44
//結(jié)果:[12, 5, 8, 130, 44].filter(isBigEnough) : 12, 130, 44
功能說明:
對數(shù)組中的每個元素都執(zhí)行一次指定的函數(shù)(callback)诉植,并且創(chuàng)建一個新的數(shù)組祥国,該數(shù)組元素是所有回調(diào)函數(shù)執(zhí)行時返回值為 true 的原數(shù)組元素。它只對數(shù)組中的非空元素執(zhí)行指定的函數(shù)晾腔,沒有賦值或者已經(jīng)刪除的元素將被忽略舌稀,同時,新創(chuàng)建的數(shù)組也不會包含這些元素灼擂。
回調(diào)函數(shù)可以有三個參數(shù):當(dāng)前元素壁查,當(dāng)前元素的索引和當(dāng)前的數(shù)組對象。
如參數(shù)thisObject被傳遞進來剔应,它將被當(dāng)做回調(diào)函數(shù)(callback)內(nèi)部的 this 對象睡腿,如果沒有傳遞或者為null,那么將會使用全局對象峻贮。
filter 不會改變原有數(shù)組席怪,記住:只有在回調(diào)函數(shù)執(zhí)行前傳入的數(shù)組元素才有效纤控,在回調(diào)函數(shù)開始執(zhí)行后才添加的元素將被忽略挂捻,而在回調(diào)函數(shù)開始執(zhí)行到最后一個元素這一期間,數(shù)組元素被刪除或者被更改的船万,將以回調(diào)函數(shù)訪問到該元素的時間為準(zhǔn)刻撒,被刪除的元素將被忽略骨田。
some():
對數(shù)組中的每個元素都執(zhí)行一次指定的函數(shù)(callback),直到此函數(shù)返回true声怔,如果發(fā)現(xiàn)這個元素态贤,some 將返回true,如果回調(diào)函數(shù)對每個元素執(zhí)行后都返回 false 捧搞,some 將返回false抵卫。它只對數(shù)組中的非空元素執(zhí)行指定的函數(shù),沒有賦值或者已經(jīng)刪除的元素將被忽略胎撇。
//檢查是否有數(shù)組元素大于等于10:
function isBigEnough(element, index, array) {
return (element >= 10);
}
var passed = [2, 5, 8, 1, 4].some(isBigEnough);
// passed is false
passed = [12, 5, 8, 1, 4].some(isBigEnough);
// passed is true
//結(jié)果:
//[2, 5, 8, 1, 4].some(isBigEnough) : false
//[12, 5, 8, 1, 4].some(isBigEnough) : true
every():
對數(shù)組中的每個元素都執(zhí)行一次指定的函數(shù)(callback)介粘,直到此函數(shù)返回false,如果發(fā)現(xiàn)這個元素晚树,every 將返回false姻采,如果回調(diào)函數(shù)對每個元素執(zhí)行后都返回 true ,every 將返回true爵憎。它只對數(shù)組中的非空元素執(zhí)行指定的函數(shù)慨亲,沒有賦值或者已經(jīng)刪除的元素將被忽略。
//測試是否所有數(shù)組元素都大于等于10:
function isBigEnough(element, index, array) {
return (element >= 10);
}
var passed = [12, 5, 8, 130, 44].every(isBigEnough);
// passed is false
passed = [12, 54, 18, 130, 44].every(isBigEnough);
// passed is true
//結(jié)果:
//[12, 5, 8, 130, 44].every(isBigEnough) 返回 : false
//[12, 54, 18, 130, 44].every(isBigEnough) 返回 : true
for...in...和for
數(shù)組既可以用for循環(huán)宝鼓,也可以用for in循環(huán)(區(qū)別:for循環(huán)可以設(shè)置i的開始數(shù)字刑棵,可以從任何一個位置開始循環(huán),但是for in循環(huán)不能設(shè)置愚铡,只能從第一個到最后一個進行循環(huán))蛉签。
json只能用for in循環(huán),因為json的下標(biāo)是沒有規(guī)律的字符串沥寥,沒有l(wèi)ength碍舍。
所以,一般數(shù)組就用for循環(huán)邑雅,json用for in循環(huán)片橡。
循環(huán)遍歷對象的key,是鍵值對前面的那一個哦
一般不推薦遍歷數(shù)組淮野,因為for in遍歷后的不能保證順序捧书,而且原型鏈上的屬性也會被遍歷到,因此一般常用來遍歷非數(shù)組的對象并且使用hasOwnProperty()方法去過濾掉原型鏈上的屬性
var myArry =[1,2,3,4];
myArry.desc ='four';
for(var value in myArry){ //循環(huán)key
console.log(value)
}
//"0"
//"1"
//"2"
//"3"
//"desc" 注意這里添加上去的屬性也被遍歷出來了
for of遍歷對象
循環(huán)遍歷對象的值骤星,是遍歷鍵值對后面的那一個value哦 经瓷,與for in遍歷key相反
var myArry =[1,2,3,4];
myArry.desc ='four';
for(var value of myArry){
console.log(value)
}
//1
//2
//3
//4
這是最簡潔、最直接的遍歷數(shù)組元素的語法
這個方法避開了for-in循環(huán)的所有缺陷
與forEach()不同的是妈踊,它可以正確響應(yīng)break了嚎、continue和return語句