一、for循環
1 (function() { 2 for(var i=0, len=demoArr.length; i<len; i++) { 3 if (i == 2) { 4 // return; // 函數執行被終止 5 // break; // 循環被終止 6 continue; // 循環被跳過 7 }; 8 console.log('demo1Arr['+ i +']:' + demo1Arr[i]); 9 } 10 })();
⚠️:關於for循環,有以下幾點需要注意
- for循環中的
i
在循環結束之后任然存在與作用域中,為了避免影響作用域中的其他變量,使用函數自執行的方式將其隔離起來()()
;或者也可以使用let聲明i。 - 避免使用
for(var i=0; i<demoArr.length
的方式,這樣的數組長度每次都被計算,效率低於上面的方式。
也可以將變量聲明放在for的前面來執行,提高閱讀性。
二、for-in
- 遍歷數組時,i表示索引值, arr表示當前索引值對應的元素 arr[i]
- 遍歷對象時,i表示key值,arr表示key值對應的value值 obj[i]
1 (function() { 2 for(var i in demoArr) { 3 if (i == 2) { 4 return; // 函數執行被終止 5 // break; // 循環被終止 6 // continue; // 循環被跳過 7 }; 8 console.log('demoArr['+ i +']:' + demoArr[i]); 9 } 10 console.log('-------------'); 11 })();
⚠️:關於for-in循環,有以下幾點需要注意
- 在for循環與for in循環中,
i
值都會在循環結束之后保留下來。因此使用函數自執行的方式避免。 - 使用return,break,continue跳出循環都與for循環一致,不過關於return需要注意,⚠️在函數體中,return表示函數執行終止,就算是循環外面的代碼,也不再繼續往下執行。而break僅僅只是終止循環,后面的代碼會繼續執行。
1 function res() { 2 var demoArr = ['Javascript', 'Gulp', 'CSS3', 'Grunt', 'jQuery', 'angular']; 3 4 for(var item in demoArr) { 5 if (item == 2) { 6 return; 7 }; 8 console.log(item, demoArr[item]); 9 } 10 console.log('desc', 'function res'); //不會執行 11 }
三、for-of(需要es6支持)
for(let value of arr) { });
四、forEach(func)
demoArr.forEach(function(arg) {})
1 demoArr.forEach(function(val, index) { 2 if (val == 'CSS3') { 3 return; // 循環被跳過 4 // break; // 報錯 5 // continue;// 報錯 6 }; 7 console.log(val, index); 8 })
⚠️:具體有以下需要注意的地方
- 回調函數中有2個參數,分別表示值和索引,這一點與jQuery中的$.each相反
-
1 $.each(demoArr, function(i, ele) { 2 console.log(i, ele); 3 })
- forEach無法遍歷對象
- forEach無法在IE中使用,firefox和chrome實現了該方法
- forEach無法使用break,continue跳出循環,使用return時,效果和在for循環中使用continue一致
- 最重要的一點,可以添加第二參數,為一個數組,而且回調函數中的this會指向這個數組。而如果沒有第二參數,則this會指向window。
1 var newArr = []; 2 demoArr.forEach(function(val, index) { 3 this.push(val); // 這里的this指向newArr 4 }, newArr)
五、arr.map(function(n){ });
arr.map(function(n){
});
六、性能對比