最近作了一個新項目,閒暇review了下代碼,發現本身用了不少for循環(簡潔明瞭),再看下別人的代碼幾乎沒有
for
,幾乎全是foreach
和map
循環,難道是我寫的太low了嗎?其實在寫碼的時候有時候也有選擇恐慌症,到底該用哪一種循環,最後發現其餘方法老是不能爲我所用,最後老是選擇了最簡單的for
,怎一個好用了得,也早想花點時間好好研究比較一下數組的這些循環方法,下面就開始正文啦😄!數組
「普通版」
let arr = [1, 2, 3, 4, 5];
for(let i = 0; i < arr.length; i++) {
arr[i] = arr[i] * 2;
}
console.log(arr); //[2, 4, 6, 8, 10]
「升級版」
let arr = [1, 2, 3, 4, 5];
for(let i = 0; len = arr.length,i < len; i++) {
arr[i] = arr[i] * 2;
}
console.log(arr); //[2, 4, 6, 8, 10]
複製代碼
let arr = [1, 2, 3, 4, 5];
arr.forEach((value, index, array) => {
return value * 2;
});
console.log(arr); //[1, 2, 3, 4, 5]
複製代碼
let arr = [1, 2, 3, 4, 5];
let arrs = arr.map((value, index, array) => {
return value * 2;
});
console.log(arrs); //[2, 4, 6, 8, 10]
複製代碼
return true
爲想要的值,return false
則爲去掉的值,通常用來過濾一個數組,不改變原來的數組。let arr = [1, 2, 3, 4, 5];
let arrs = arr.filter((value, index, array) => {
if (value > 2) {
return true;
} else {
return false;
}
});
console.log(arrs); //[3, 4, 5]
複製代碼
let arr = [1, 2, 3, 4, 5];
let arrs = arr.reduce((prev, next, index, array) => {
console.log(prev); // 1,3,6,10
console.log(next); // 2,3,4,5
return prev + next;
});
console.log(arrs); //15
複製代碼
Boolean
,不是篩選一個新的數組,而是篩選有沒符合條件的值,只要有一個值知足即馬上返回true,再也不繼續執行,不然返回false。let arr = [1, 2, 3, 4, 5];
let arrs = arr.some((value, index, array) => {
return value > 3;
});
console.log(arrs); // true
複製代碼
let arr = [1, 2, 3, 4, 5];
let arrs = arr.every((value, index, array) => {
return value > 3;
});
console.log(arrs); //false
let arr = [ 4, 5];
let arrs = arr.every((value, index, array) => {
return value > 3;
});
console.log(arrs); //true
複製代碼
let arr = [1, 2, 3, 4, 5];
let arrs = arr.indexOf(2);
console.log(arrs); // 1
let arr = [1, 2, 3, 4, 5];
let arrs = arr.indexOf(6);
console.log(arrs); // -1
複製代碼
let arr = [1, 2, 3, 4, 5, 1];
let arrs = arr.lastIndexOf(1);
console.log(arrs); // 5
let arr = [1, 2, 3, 4, 5, 1];
let arrs = arr.lastIndexOf(6);
console.log(arrs); // -1
複製代碼
let arr = [1, 2, 3, 4, 5];
for(let i in arr) {
console.log(i); // 0, 1, 2, 3, 4
}
let arr = {name: "lewis", age: 25};
for(let i in arr) {
console.log(i); // name, age
}
複製代碼
for...of
數組遍歷方法:for...of: JavaScript
原有的for...in
循環,只能得到對象的鍵名,不能直接獲取鍵值。ES6 提供for...of
循環,容許遍歷得到鍵值,可是不能循環對象,通常用來循環數組。bash
let arr = [1, 2, 3, 4, 5];
for (let i in arr) {
console.log(i); // 0, 1, 2, 3, 4
}
for (let i of arr) {
console.log(i); // 1, 2, 3, 4, 5
}
複製代碼
總結: 看到這裏相信你已經把基本用法和示例弄的差很少了,接下來總結一下,通常的循環用for
,for...in
,for...of
和forEach
,須要映射爲新數組的用map
,須要篩選出想要的用filter
,數值須要進行累加的用reduce
,若是要找一些值用some
和every
,而且想知道值的具體位置的能夠用indexOf
和lastIndexOf
,接下來就是對症下藥,因地制宜了,相信你會熟練掌握並準確應用了。函數
let arr = Array(100).fill(5);
console.time("for循環");
for(let i = 0; i < arr.length; i++) {
arr[i] = arr[i] * 2;
}
console.timeEnd("for循環"); // for循環: 0.041ms
console.time("for...in循環");
for(let i in arr) {
arr[i] = arr[i] * 2;
}
console.timeEnd("for...in循環"); // for...in循環: 0.126ms
console.time("for...of循環");
for(let i of arr) {
arr[i] = arr[i] * 2;
}
console.timeEnd("for...of循環"); // for...of循環: 3532.695ms
console.time("forEach循環");
arr.forEach((value, index, arr) => {
arr[index] = value * 2;
});
console.timeEnd("forEach循環"); // forEach循環: 0.103ms
console.time("map循環");
arr.map((value, index, arr) => {
arr[index] = value * 2;
});
console.timeEnd("map循環"); //map循環: 0.086ms
複製代碼
哈哈,通過屢次對比取平均值能夠明顯的看到for
循環秒殺其餘方法(這只是100個數,若是更多的數效果將會更明顯),原來本身的方法一點都不low啊,只要在正確的場合應用正確的方法並簡單有效纔是最好的,之後通常的循環你們能夠大膽的使用for循環啦!性能
精彩預告:最近歷時兩個月的大需求遇到不少深坑,接下來會相繼分享出來,以此共勉😂ui
更多精彩內容歡迎關注個人公衆號【天道酬勤Lewis】this