for in與for of, 陣列與 物件 的遍歷
for of 與 for in 的區別
for..of適用遍歷數/陣列物件/字串/map/set等擁有迭代器物件的集合.但是不能遍歷物件,因為沒有迭代器物件.與forEach()不同的是,它可以正確響應break、continue和return語句
for-of迴圈不支援普通物件,但如果你想迭代一個物件的屬性,你可以用for-in迴圈(這也是它的本職工作)或內建的Object.keys()方法
for in 可以遍歷到myObject的原型方法method,如果不想遍歷原型方法和屬性的話
結果,物件正常,陣列原型上的東西被遍歷下來了
陣列的遍歷
1.普通for迴圈
var arr = [1,2,0,3,9]; for ( var i = 0; i <arr.length; i++){ console.log(arr[i]); }
2.優化版for迴圈
使用變數,將長度快取起來,避免重複獲取長度,陣列很大時優化效果明顯
for(var j = 0,len = arr.length; j < len; j++){ console.log(arr[j]); }
3.forEach
ES5推出的,陣列自帶的迴圈,主要功能是遍歷陣列
arr.forEach(function(value,i){
console.log('forEach遍歷:'+i+'--'+value);
})
forEach這種方法也有一個小缺陷:你不能使用break語句中斷迴圈,也不能使用return語句返回到外層函式。
4.map遍歷
map即是 “對映”的意思 用法與 forEach 相似,同樣不能使用break語句中斷迴圈,也不能使用return語句返回到外層函式。
arr.map(function(value,index){ console.log('map遍歷:'+index+'--'+value); });
map遍歷支援使用return語句,支援return返回值
var temp=arr.map(function(val,index){ console.log(val); return val*val }) console.log(temp);
forEach、map都是ECMA5新增陣列的方法,所以ie9以下的瀏覽器還不支援
5.for-of遍歷
ES6新增功能
for( let i of arr){ console.log(i); }
- for-of這個方法避開了for-in迴圈的所有缺陷
- 與forEach()不同的是,它可以正確響應break、continue和return語句
for-of迴圈不僅支援陣列,還支援大多數類陣列物件,例如DOMNodeList物件。for-of迴圈也支援字串遍歷
物件遍歷
1.for-in遍歷
for-in是為遍歷物件而設計的,不適用於遍歷陣列。(遍歷陣列的缺點:陣列的下標index值是數字,for-in遍歷的index值"0","1","2"等是字串)
for-in迴圈存在缺陷:迴圈會遍歷物件自身的和繼承的可列舉屬性(不含Symbol屬性)
for (var index in arr){ console.log(arr[index]); console.log(index); }
2.使用Object.keys()遍歷
返回一個數組,包括物件自身的(不含繼承的)所有可列舉屬性(不含Symbol屬性).
var obj = {'0':'a','1':'b','2':'c'}; Object.keys(obj).forEach(function(key){ console.log(key,obj[key]); });