javascript 中forEach方法
阿新 • • 發佈:2019-01-29
陣列的forEach方法(IE9+支援)
返回:undefined
forEach 方法按升序為陣列中 含 有效值的每一項執行一次callback函式,那些已刪除(使用daleta方法等情況) 或者未初始化的項將被跳過(但不包括那些指為undefined的項 ) ;
方法接受一個回撥函式,回撥函式接受三個引數:當前項、索引、操作的陣列
var array1 = ['a', 'b', 'c'];
array1.forEach(function(element) {
console.log(element);
});
// a
// b
// c
forEach()
方法對陣列的每個元素執行一次提供的函式。
案例:for 迴圈轉換為 forEach
轉換之前
const items = ['item1', 'item2', 'item3'];
const copy = [];
for (let i=0; i<items.length; i++) {
copy.push(items[i])
}
轉換之後
const items = ['item1', 'item2', 'item3'];
const copy = [];
items.forEach(function(item){
copy.push(item)
});
其結果都是
copy: ["item1", "item2", "item3"]
案例:打印出陣列的內容
function logArrayElements(element, index, array) { console.log("a[" + index + "] = " + element); } // 注意索引2被跳過了,因為在陣列的這個位置沒有項 [2, 5, ,9].forEach(logArrayElements); // a[0] = 2 // a[1] = 5 // a[3] = 9 [2, 5,"" ,9].forEach(logArrayElements); // a[0] = 2 // a[1] = 5 // a[2] = // a[3] = 9 [2, 5, undefined ,9].forEach(logArrayElements); // a[0] = 2 // a[1] = 5 // a[2] = undefined // a[3] = 9 let xxx; // undefined [2, 5, xxx ,9].forEach(logArrayElements); // a[0] = 2 // a[1] = 5 // a[2] = undefined // a[3] = 9
forEach
遍歷的範圍在第一次呼叫 回撥前就會確定。呼叫forEach
後新增到陣列中的項不會被 回撥 訪問到。如果已經存在的值被改變,則傳遞給 回撥的值是 forEach
遍歷到他們那一刻的值。已刪除的項不會被遍歷到。如果已訪問的元素在迭代時被刪除了(例如使用 shift()
) ,之後的元素將被跳過——看程式碼
var words = ["one", "two", "three", "four"];
words.forEach(function(word) {
console.log(word);
if (word === "two") {
words.shift();
}
});
// one
// two
// four
上面的程式碼不知道有看懂沒有,是因為當你執行到two的時候刪除陣列的第一項,然而呢本來索引是 1 的項因為你把前面的項刪掉了以後,索引就變成 0 了,而 0 你已經執行過了,所以並不會在執行一邊,forEach 遍歷的範圍在第一次呼叫回撥函式前就已經確定,已刪除的項不會被遍歷到。
在來看一個例子,只是在上面稍稍改動一下:
var words = ["one", "two", "three","", "four"];
words.forEach(function(word) {
words = ["one", "two", "three","fix", "four"];
console.log(word);
if (word === "two") {
words.shift();
}
});
// one
// two
// three
//
// four
上面索引為 3 的時候 輸出的結果為空,即使是你已經給他重新賦值了一次,再來看下words的結果:
console.log(words)
// ["one", "two", "three", "fix", "four"]
以上就是我總結的,如果補充請大佬在聯絡我,瘋狂給大佬打call❀❀❀