|
array.forEach(callback[, thisObject]);
下面是參數的詳細信息:
1、 callback : 函數測試數組的每個元素。
2、thisObject : 對象作為該執行回調時使用.
forEach是ECMA5中Array新方法中最基本的一個,就是遍歷,循環。
Array在ES5新增的方法中,參數都是function類型,默認有傳參,forEach方法中的function回調支持3個參數,第1個是遍歷的數組內容;第2個是對應的數組索引,第3個是數組本身。
[].forEach(
function
(value, index, array) {
// ...
});
$.each([],
function
(index, value, array) {
// ...
});
這里的map不是“地圖”的意思,而是指“映射”。[].map(); 基本用法跟forEach方法類似
array.map(callback,[ thisObject]);
[].map(
function
(value, index, array) {
// ...
});
map方法的作用不難理解,“映射”嘛,也就是原數組被“映射”成對應新數組。
var
data=[1,3,4]
var
Squares=data.map(
function
(val,index,arr){
console.log(arr[index]==val);
// ==> true
return
val*val
})
console.log(Squares);
// ==> [1, 9, 16]
注意:由於forEach、map都是ECMA5新增數組的方法,所以ie9以下的瀏覽器還不支持(萬惡的IE啊),不過呢,可以從Array原型擴展可以實現以上全部功能,例如forEach方法。
優勢:foreach和map相對於for來說,實現同樣的功能,但是方便書寫節省代碼量
forEach相比普通的for循環的優勢在於洗漱數組的處理,或跳過數組的空位,如下
for循環:
var arr = new Array(1000); arr[0] = 1; arr[99] = 3; arr[999] = 5; // for循環 for (var i = 0, l = arr.length; i < l; i++) { console.log('arr[%s]', i, arr[i]); } console.log('i :' , i); // ... // arr[0] 1 // ... // arr[99] 3 // ... // arr[999] 5 // i : 1000 // for - in 循環 var count = 0; for(var j in arr){ count ++ ; if(arr.hasOwnProperty(j)){ console.log('arr[%s]', j, arr[j]); } } console.log('count : ', count); // arr[0] 1 // arr[99] 3 // arr[999] 5 // i : 1000
forEach循環:
var arr = new Array(1000); arr[0] = 1; arr[99] = 3; arr[999] = 5; var count = 0; arr.forEach(function(value, index) { count++; console.log(typeof index); console.log(index, value); }); console.log('count', count); // number // 0 1 // number // 99 3 // number // 999 5 // count 3
Array 在 Javascript 中是一個對象, Array 的索引是屬性名。
事實上, Javascript 中的 “array” 有些誤導性, Javascript 中的 Array 並不像大部分其他語言的數組。首先, Javascript 中的 Array 在內存上並不連續,其次, Array 的索引並不是指偏移量。
實際上, Array 的索引也不是 Number 類型,而是 String 類型的。我們可以正確使用如 arr[0] 的寫法的原因是語言可以自動將 Number 類型的 0 轉換成 String 類型的 "0" 。
所以,在 Javascript 中從來就沒有 Array 的索引,而只有類似 "0" 、 "1" 等等的屬性。有趣的是,每個 Array 對象都有一個 length 的屬性,導致其表現地更像其他語言的數組。
但為什么在遍歷 Array 對象的時候沒有輸出 length 這一條屬性呢?那是因為 for-in 只能遍歷“可枚舉的屬性”, length 屬於不可枚舉屬性,實際上, Array 對象還有許多其他不可枚舉的屬性。
map可以做鏈式操作,forEach不可以,
for不用擔心兼容性的問題,還有可以break跳出循環,是基礎循環,可以有for...in,foo...of,for(let i=0;i<len;i++)等。可以用continue和break控制
forEach是for(let i=0;i<len;i++)的縮寫,不支持continue和break,可以return來控制循環,forEach是不能退出循環本身的
map循環當前可循環對象,並且返回新的可循環對象,而forEach沒有返回值
forEach只有在火狐和谷歌瀏覽器中Array有這個方法,在IE中就米有,需要用prototype手動添加這個方法