for of 遍歷數組內的元素,而不包括數組的原型屬性method和索引name;
數組用法:
const arr = [1,2,3,2,5,1]; for(let i of arr){ console.log(i);//打印出來為value 1 2 3 2 5 1 }; for(let i in arr){ console.log(i);//打印出來為下標0 1 2 3 4 5 }
對象用法:
const obj={ a:1, b:2, c:3 } for(let i in obj){ console.log(i);//打印出來為key a b c }; for(let i of obj){ console.log(i);//error obj is not iterable,在es6中object沒有規定默認的屬性 }
解決:object.keys() 獲取指定對象中的屬性名稱 或 方法名稱
Object.keys()返回值說明:
此方法返回一個數組,數組中包含鍵名稱和方法名稱
const obj={ a:1, b:2, c:3 } for(let i of Object.keys(obj)){ console.log(i);//打印出為a b c }
JS數組遍歷:
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推出的,數組自帶的循環,主要功能是遍歷數組,實際性能比for還弱
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循環不僅支持數組,還支持大多數類數組對象,例如DOM NodeList對象。for-of循環也支持字符串遍歷
JS對象遍歷:
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]); });
3.使用Object.getOwnPropertyNames(obj)遍歷
返回一個數組,包含對象自身的所有屬性(不含Symbol屬性,但是包括不可枚舉屬性).
Object.getOwnPropertyNames(obj).forEach(function(key){ console.log(key,obj[key]); });
4.使用Reflect.ownKeys(obj)遍歷
返回一個數組,包含對象自身的所有屬性,不管屬性名是Symbol或字符串,也不管是否可枚舉.
Reflect.ownKeys(obj).forEach(function(key){ console.log(key,obj[key]); });