1.背景介紹
使用JavaScript數(shù)組常常需要對數(shù)組進(jìn)行遍歷、迭代操作。而我們常用的就是for語句對數(shù)組進(jìn)行迭代。然而在ECMAscript5已經(jīng)為數(shù)組定義了5個(gè)迭代的方法,分別是:filter、some、map、foreach、every,下面我們講講它們的具體作用。
2.知識剖析
2.1、every():對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),如果該函數(shù)對每一項(xiàng)都返回true,則返回true ;
some():對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),如果該函數(shù)對任一項(xiàng)返回true,則返回true;
為了加深對它們的理解,以上兩個(gè)迭代方式有必要放在一起demo,

some+every demo

some+every console結(jié)果
通過 demo,可以看出 every() ,在遍歷數(shù)組項(xiàng)的時(shí)候,第一項(xiàng)的值就已經(jīng)為false了,所以直接返回false不再繼續(xù)執(zhí)行后面的迭代;
第二個(gè),some() ,在遍歷數(shù)組項(xiàng)的時(shí)候,當(dāng)?shù)谝粋€(gè)滿足函數(shù)體的項(xiàng)出現(xiàn),就直接返回true,并且不再執(zhí)行后面的迭代;
2.2、filter():對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),返回該函數(shù)會返回true 的項(xiàng)組成的數(shù)組。

filter demo

filter console結(jié)果
通過demo,可以看出 filter() 把原數(shù)組arr每一項(xiàng)返回為true的項(xiàng),重新組成數(shù)組,并打印出該數(shù)組每個(gè)索引的值和數(shù)組長度;
2.3、map():對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組 ;

man demo

man console結(jié)果
通過demo可以看出 map() 把原數(shù)組arr的每一項(xiàng)迭代返回的結(jié)果,重新組成數(shù)組,并打印出該數(shù)組每個(gè)索引的值和數(shù)組長度;
2.4、forEach():對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),這個(gè)方法并沒有返回值 ;

forEach demo

forEach console 結(jié)果
通過demo可以看出 forEach() ,只是對每個(gè)數(shù)組項(xiàng)運(yùn)行指定的函數(shù)體,這個(gè)迭代方式并沒有返回值;
3.常見問題
如何判斷兩個(gè)數(shù)組中相同的項(xiàng),然后將相同的部分或者不同的部分生成新的數(shù)組?
4.解決方案
var num1 = [1,2,3,4,5,7];
var num2 = [2,3,5];
var nums = num1.filter(function(aaa){
return num2.indexOf(aaa) >= 0;
});
console.log(nums);
5.擴(kuò)展思考
問:相對于for(),JS數(shù)組自定義的數(shù)組迭代方式有哪些好處?這里面參數(shù)item、index和array代表的是什么?
答:在實(shí)現(xiàn)相同功能的前提下,后者除了能夠節(jié)省代碼量外,在實(shí)現(xiàn)某些功能上的流程中存在很多有意思的優(yōu)勢,比如forEach相比普通的for循環(huán)的優(yōu)勢在于對稀疏數(shù)組的處理,會跳過數(shù)組中的空位。for+i在性能測試上是優(yōu)越于后者,但是前提是,array的length要事先計(jì)算出來,而在處理非常大量的數(shù)據(jù)時(shí)候,后者的優(yōu)勢就顯而易見了。
答:傳入這些方法中的函數(shù)會接收三個(gè)參數(shù),item表示遍歷后的當(dāng)前對象,里面的index代表當(dāng)前循環(huán)到第幾個(gè)索引,array代表數(shù)組對象本身;
6.參考文獻(xiàn)
JavaScript高級程序設(shè)計(jì)第三版
W3Cschool JavaScript教程
網(wǎng)絡(luò)搜索引擎