interable【迭代】
array可以使用for下标循环,但是Map和Set无法使用for下标循环。ES6标准为了统一,特意引入 interable 类型,Array/Map/Set都属于 interable 类型,可以使用for…of循环来遍历。
for…of 和 for…in
for…of循环与for…in循环的区别:
① for…in循环用在array中,Map和Set中不能使用;
②for…in循环用在array中,遍历到的值是key值,是数组中的索引。遍历object对象时,结果是属性即key,结果并没有值value;
③另一个区别是:for…of循环修复了for…in循环中增加额外属性即key的功能,且for…of用来不能循环对象,如以下代码:
//数组的循环
var arr= [1,23,3];
arr.name = 'neo';
//for...in循环增加了'name'的属性,
//但是arr.length并不包括'name'属性。'name'属性是额外属性。
console.log(arr, arr.length); //[1,23,3,name:'neo] 3
for(var x in arr){
console.log(x); //0,1,2,name for...of循环包括所有的key。
}
for(var y of arr){
console.log(y); //1,23,3 for...of循环只包括自身属性。
}
//对象的循环
var obj = {
name : 'neo',
age : 20,
gender : 'male'
};
for(var i in obj ){
console.log(i); //name,age,gender 也是只循环key
}
for(var o of obj){
console.log(o); //Uncaught TypeError: obj is not iterable obj不是可迭代类型
}
以上是为什么引入for…of循环;遍历 interable 类型,最好使用 interable 内置 forEach方法,它接收一个函数,每次迭代自动回调该函数:
var set=new Set([5,6,7]);
var map=new Map([[1,”x”],[2,”y”],[3,”z”]]);
Set:
set.forEach(function(element,index,self){
console.log(element); //5,6,7指向当前元素的值;value
console.log(index); //5,6,7指向当前元素的值;value
console.log(self); //指向Set对象本身
})
Map:
map.forEach(function(element,index,self){
console.log(element); //元素的值value
console.log(index); //元素的键key
console.log(self); //指向Map对象本身
})