js for in 循环和for of循环

607 阅读2分钟

每一天一个知识点,积累少成多。

一for in遍历的特点 用它遍历数组

Array.prototype.methods=function(){
  console.log(this.length);
}
var myArray=[1,2,4,5,6,7]
myArray.name="数组"
for (var index in myArray) {
  console.log(myArray[index]);
}

1,index 为字符串型数字不能进行计算, 2.使用for in 会遍历数组上的所有的可枚举属性,包括原型列入上面添加在原型上的方法,和name属性。

所以for in 更适合遍历对象,不太适合遍历数组。

二 用for of 遍历数组

Array.prototype.method=function(){
      console.log(this.length);
    }
    var myArray=[1,2,4,5,6,7]
    myArray.name="数组";
    for (var value of myArray) {
      console.log(value);
    } 

总结for in 遍历数组是数组的索引(键名)for...of 遍历数组是数组的元素值。for of 遍历的只是数组内的元素,而不包括数组原型上的属性method,和索引name.

遍历对象

遍历对象通常用for in 来遍历对象的键名

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

可以看出for in 遍历对象包含他原型的属性和方法。

for of 遍历对象报错,由此可知for of 不能遍历对象

怎么让for in 遍历不遍历出新增在该对象原型的属性和方法。就要用hasOwnProperty
Object.prototype.method=function(){
      console.log(this);
    }
    var myObject={
      a:1,
      b:2,
      c:3
    }
    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]);
}

1 for of 遍历字符串

var str = "afdsf"
for (var key of str) {
    // console.log(key)
}

2 for of 遍历map 结构和set 的结构 遍历map结构时可以用结构赋值

用结构赋值后

当你为对象添加myObject.toString()方法后,就可以将对象转化为字符串,同样地,当你向任意对象添加myObjectSymbol.iterator方法,就可以遍历这个对象了。所有拥有Symbol.iterator的对象被称为可迭代的。在接下来的文章中你会发现,可迭代对象的概念几乎贯穿于整门语言之中,不仅是for-of循环,还有Map和Set构造函数、解构赋值,以及新的展开操作符。
for of执行的步骤

for of 循环首先调集Symbol.iterator方法,紧接着返回一个新的迭代器对象,迭代器对象可以任意有.next的方法对象;for of循环将重复调用这个方法,每次循环调用一次,下面给特最简单的迭代器代码

var zeroesForeverIterator = {
 [Symbol.iterator]: function () {
   return this;
  },
  next: function () {
  return {done: false, value: 0};
 };