讲for...of之前应该先讲for...in。
for...in是我们一开始学数组对象遍历时最常用的方式,但是那样写很麻烦,像下面这样
var arr=[1,3,5,7,9];
for(let i=0;i
但是,这种写法略显麻烦,可以改成下面这种,略微简单
var arr=[1,3,5,7,9];
for(let i in arr){
console.log(i);//当前元素下标
console.log(arr[i]);//当前元素
}
但还是不太好用,因为for...in会将原型链上的属性方法都遍历出来,这样会导致很多麻烦,length啥的都不准,比如你在原型链上定义过一些属性或方法,使用for...in的话就会将这些方法一起遍历出来,
Array.prototype.sss=function(){
console.log(1)
}
var arr=[1,3,5,7,9];
for(let i in arr){
console.log(i,arr[i]);//当前元素下标、元素本身
}
Object.prototype.s=function(){
console.log(2)
}
var obj={m:2,ss:66};
for(let i in obj){
console.log(i,obj[i]);//当前元素下标、元素本身
}
如果不想那些属性啥的被遍历出来,可以使用hasOwnProperty()-----(这个用在对象上好点,因为这个是用来判断对象是否含有该属性的,而数组虽然也是对象,但每个元素的索引被视为对象的属性,所以如果用arr.hasOwnProperty(i)来对数组进行判断,实际上是行不通的),在对象上使用如下
var o = {
name: 'Jack',
age: 20,
city: 'Beijing'
};
for (var key in o) {
if (o.hasOwnProperty(key)) {
console.log(key); // 'name', 'age', 'city'
}
}
(除非你本来就是想把这些额外的属性方法也一起遍历出来,毕竟有些时候我们就是不知道原型链上有啥属性方法),由于Array
也是对象,而它的每个元素的索引被视为对象的属性,因此,for ... in
循环可以直接循环出Array
的索引:
而for...of是iterable类型才能使用的(iterable包括array、set、map,但不包括object),作用类似于for...in,
在用于数组上时如下:
var arr=[1,3,5,7,9];
for(let item of arr){
console.log(item);//当前元素
}
但是,for...of在用于数组遍历时是无法直接获取到当前下标的,如果想获取到当前下标志,可以通过如下方式
var arr=[1,3,5,7,9];
for(let [i,v] of arr.entries()){
console.log(i);//当前元素下标
console.log(v);//当前元素
}