for in和for of的区别

171 阅读2分钟

1,遍历数组的方法

ES5, 有forEach, map, filter, some, every, reduce, reduceRight等等,只是返回的结果不一样

用forEach遍历数组,使用break不能中断循环,使用return也不能返回到外层函数

2, for in遍历数组的毛病

  • index索引为字符串型数字,不能直接进行几何运算
  • 遍历顺序有可能不是按照实际数组的内部顺序\
  • 使用for in会遍历数组所有的可枚举属性,包括原型,所以for in更适合遍历对象,不要使用for in遍历数组

for in遍历的是数组的索引(即键名),而 for of遍历的是数组元素值

 Object.prototype.method = function () {
    console.log(this);
  }
  var myObject = {
    a: 1,
    b: 2,
    c: 3
  }
  for (var key in myObject) {
    console.log(key);// a b c method
  }


for in 可以遍历到myObject的原型方法method,如果不想遍历原型方法和属性的话,可以在循环内部判断一下,hasOwnPropery方法可以判断某属性是否是该对象的实例属性


for (var key in myObject) {
  if(myObject.hasOwnProperty(key)){
    console.log(key);
  }
}
  • for..of适用遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合.但是不能遍历对象,因为没有迭代器对象.与forEach()不同的是,它可以正确响应break、continue和return语句
  • for-of循环不支持普通对象,但如果你想迭代一个对象的属性,你可以用for-in循环(这也是它的本职工作)或内建的Object.keys()方法:

for (var key of Object.keys(someObject)) {
  console.log(key + ": " + someObject[key]);
}

  • 遍历map对象时适合用解构,例如;
for (var [key, value] of phoneBookMap) {
   console.log(key + "'s phone number is: " + value);
}

3, 循环

// 普通的循环

var arr = [1,2,0,3,9];
 for ( var i = 0; i <arr.length; i++){
    console.log(arr[i]);
}

// 优化版循环, 使用变量,将长度缓存起来,避免重复获取长度,数组很大时优化效果明显

for(var j = 0,len = arr.length; j < len; j++){
    console.log(arr[j]);
}

// forEach, 不能使用break语句中断循环,也不能使用return语句返回到外层函数
// 没有返回值,forEach()的执行速度 < map()的执行速度

arr.forEach(function(value,i){\
  console.log('forEach遍历:'+i+'--'+value);

})

// map即是 “映射”的意思 用法与 forEach 相似,同样不能使用break语句中断循环,也不能使用return语句返回到外层函数,有返回值,可以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);