forEach
myArray.forEach(function(value){ console.log(value);});
實(shí)際上forEach有三個(gè)參數(shù)? 分別為? 值? 下標(biāo)? 數(shù)組本身 于是我們有
[].forEach(function(value, index, array) {
});
forEach只是對(duì)數(shù)組中的每一項(xiàng)運(yùn)行傳入的函數(shù),這個(gè)方法沒有返回值,對(duì)原來數(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ù)組中的每一項(xiàng)值的,用來遍歷數(shù)組中的每一項(xiàng);
map的回調(diào)函數(shù)中支持return返回值;return的是啥,相當(dāng)于把數(shù)組中的這一項(xiàng)變?yōu)樯叮ú⒉挥绊懺瓉淼臄?shù)組,只是相當(dāng)于把原數(shù)組克隆一份,把克隆的這一份的數(shù)組中的對(duì)應(yīng)項(xiàng)改變了);
不管是forEach還是map 都支持第二個(gè)參數(shù)值,第二個(gè)參數(shù)的意思是把匿名回調(diào)函數(shù)中的this進(jìn)行修改。
兼容性寫法:
/**
* 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:?要對(duì)每個(gè)數(shù)組元素執(zhí)行的回調(diào)函數(shù)。
thisObject :?在執(zhí)行回調(diào)函數(shù)時(shí)定義的this對(duì)象。
//過濾掉小于 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
功能說明:
對(duì)數(shù)組中的每個(gè)元素都執(zhí)行一次指定的函數(shù)(callback),并且創(chuàng)建一個(gè)新的數(shù)組,該數(shù)組元素是所有回調(diào)函數(shù)執(zhí)行時(shí)返回值為 true 的原數(shù)組元素。它只對(duì)數(shù)組中的非空元素執(zhí)行指定的函數(shù),沒有賦值或者已經(jīng)刪除的元素將被忽略,同時(shí),新創(chuàng)建的數(shù)組也不會(huì)包含這些元素。
回調(diào)函數(shù)可以有三個(gè)參數(shù):當(dāng)前元素,當(dāng)前元素的索引和當(dāng)前的數(shù)組對(duì)象。
如參數(shù)thisObject被傳遞進(jìn)來,它將被當(dāng)做回調(diào)函數(shù)(callback)內(nèi)部的 this 對(duì)象,如果沒有傳遞或者為null,那么將會(huì)使用全局對(duì)象。
filter 不會(huì)改變?cè)袛?shù)組,記住:只有在回調(diào)函數(shù)執(zhí)行前傳入的數(shù)組元素才有效,在回調(diào)函數(shù)開始執(zhí)行后才添加的元素將被忽略,而在回調(diào)函數(shù)開始執(zhí)行到最后一個(gè)元素這一期間,數(shù)組元素被刪除或者被更改的,將以回調(diào)函數(shù)訪問到該元素的時(shí)間為準(zhǔn),被刪除的元素將被忽略。
some():
對(duì)數(shù)組中的每個(gè)元素都執(zhí)行一次指定的函數(shù)(callback),直到此函數(shù)返回true,如果發(fā)現(xiàn)這個(gè)元素,some 將返回true,如果回調(diào)函數(shù)對(duì)每個(gè)元素執(zhí)行后都返回 false ,some 將返回false。它只對(duì)數(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():
對(duì)數(shù)組中的每個(gè)元素都執(zhí)行一次指定的函數(shù)(callback),直到此函數(shù)返回false,如果發(fā)現(xiàn)這個(gè)元素,every 將返回false,如果回調(diào)函數(shù)對(duì)每個(gè)元素執(zhí)行后都返回 true ,every 將返回true。它只對(duì)數(shù)組中的非空元素執(zhí)行指定的函數(shù),沒有賦值或者已經(jīng)刪除的元素將被忽略。
//測(cè)試是否所有數(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ù)字,可以從任何一個(gè)位置開始循環(huán),但是for in循環(huán)不能設(shè)置,只能從第一個(gè)到最后一個(gè)進(jìn)行循環(huán))。
json只能用for in循環(huán),因?yàn)閖son的下標(biāo)是沒有規(guī)律的字符串,沒有l(wèi)ength。
所以,一般數(shù)組就用for循環(huán),json用for in循環(huán)。
循環(huán)遍歷對(duì)象的key,是鍵值對(duì)前面的那一個(gè)哦
一般不推薦遍歷數(shù)組,因?yàn)閒or in遍歷后的不能保證順序,而且原型鏈上的屬性也會(huì)被遍歷到,因此一般常用來遍歷非數(shù)組的對(duì)象并且使用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遍歷對(duì)象
循環(huán)遍歷對(duì)象的值,是遍歷鍵值對(duì)后面的那一個(gè)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
這是最簡(jiǎn)潔、最直接的遍歷數(shù)組元素的語法
這個(gè)方法避開了for-in循環(huán)的所有缺陷
與forEach()不同的是,它可以正確響應(yīng)break、continue和return語句