我們如何遍歷數組中的元素?20年前JavaScript剛萌生時,你可能這樣實現數組遍歷:
1 var arr=["one","two","three"]; 2 for(var i=0;i<arr.length;i++){ 3 document.write(arr[i]); 4 }
自ES5正式發布后,你可以使用內建的forEach方法來遍歷數組:
myArray.forEach(function (value) { console.log(value); });
實際上forEach有三個參數 分別為 值 下標 數組本身 於是我們有
[].forEach(function(value, index, array) {
// ...
});
對比jQuery中的$.each
方法:
$.each([], function(index, value, array) {
// ...
});
會發現,第1個和第2個參數正好是相反的,大家要注意了,不要記錯了。后面類似的方法,例如$.map
也是如此。
$.each(Array, function(i, value) { Array //數組 this; //this指向當前元素 i; //i表示Array當前下標 value; //value表示Array當前元素 });
var arr = [ "one", "two", "three", "four"]; $.each(arr, function(){ alert(this); });
//上面這個each輸出的結果分別為:one,two,three,four
var obj = { one:1, two:2, three:3, four:4}; $.each(obj, function(key, val) { alert(obj[key]); });
//這個each就有更厲害了,能循環每一個屬性
//輸出結果為:1 2 3 4
例如:
arr.forEach(function(i,j,v){ document.write("<br />數組的值"+i+ "<br />數組的下標"+j+","+ "<br />數組本身"+v+"---") })
這段代碼看起來更加簡潔,但這種方法也有一個小缺陷:
forEach不夠靈活
arr.forEach不好用 你不能使用break語句中斷循環,也不能使用return語句返回到外層函數。
當然,如果只用for循環的語法來遍歷數組元素也很不錯。
那么,你一定想嘗試一下for-in循環:
for (var index in myArray) { // 千萬別這樣做 console.log(myArray[index]); }
在這段代碼中,賦給index的值不是實際的數字,而是字符串“0”、“1”、“2”,此時很可能在無意之間進行字符串算數計算,例如:“2” + 1 == “21”,這給編碼過程帶來極大的不便。
簡而言之,
for-in是為普通對象設計的,你可以遍歷得到字符串類型的鍵,因此不適用於數組遍歷。
for...in
不適合用來遍歷數組
for…in會遍歷到自定義屬性甚至原型屬性、index是字符串而不是數值、某些情況下甚至不按順序遍歷
強大的for-of循環
ES6不會破壞你已經寫好的JS代碼。目前看來,成千上萬的Web網站依賴for-in循環,其中一些網站甚至將其用於數組遍歷。如果想通過修正for-in循環增加數組遍歷支持會讓這一切變得更加混亂,因此,標准委員會在ES6中增加了一種新的循環語法來解決目前的問題。
我們需要一種更方便的遍歷數組的方法,就像用 for...in
遍歷對象一樣簡單易用的方法,那就是 for...of
就像這樣:
for (var value of myArray) { console.log(value); }
是的,與之前的內建方法相比,這種循環方式看起來是否有些眼熟?那好,我們將要探究一下for-of循環的外表下隱藏着哪些強大的功能。現在,只需記住:
- 這是最簡潔、最直接的遍歷數組元素的語法
- 這個方法避開了for-in循環的所有缺陷
- 與forEach()不同的是,它可以正確響應break、continue和return語句
for-in循環用來遍歷對象屬性。
for-of循環用來遍歷數據—例如數組中的值。
但是,不僅如此!
for-of循環也可以遍歷其它的集合
for-of循環不僅支持數組,還支持大多數類數組對象,例如DOM NodeList對象。
for-of循環也支持字符串遍歷,它將字符串視為一系列的Unicode字符來進行遍歷:
for (var value of myArray) { console.log(value); }
它同樣支持Map和Set對象遍歷。
$.map(array,function)
<html>
<head>
<script type="text/javascript" src="jquery-1.8.2.min.js"></script>
<script type="text/javascript">
var arr = [2,3,6];
var arr2 = $.map(arr,function(item){return item*2;});
for(var i=0,len=arr2.length;i<len;i++){
document.write(arr2[i]+"<br />");//結果為 4 6 12
}
</script>
</head>
</html>