美文网首页
for in 和for of的区别

for in 和for of的区别

作者: 云凡的云凡 | 来源:发表于2020-10-30 19:59 被阅读0次

ES5具有遍历数组功能的有forEach、map、filter、some、every、reduce、reduceRight等,只不过他们的返回结果不一样。但是使用foreach遍历数组的话,使用break不能中断循环,使用return也不能返回到外层函数。

一、for in遍历数组的毛病

1.index索引为字符串型数字,不能直接进行几何运算。
2.遍历顺序有可能不是按照实际数组的内部顺序。
3.使用for in会遍历数组所有的可枚举属性,包括原型。例如上例的原型方法method和name属性。
所以for in更适合遍历对象,for of更适合遍历数组。

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

image.png
  Array.prototype.method = function () {
            console.log(this.length);
        }
        var myArray = [1, 2, 4, 5, 6, 7]
        myArray.name = "数组"
        for (var index in myArray) {
            console.log(myArray[index]);
        }
二、for of遍历数组的优点如下:
image.png
        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 遍历对象如下:
image.png
  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 可以遍历到myObject的原型方法method,如果不想遍历原型方法和属性的话,可以在循环内部判断一下,hasOwnPropery方法可以判断某属性是否是该对象的实例属性。

image.png
        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);
            }
        }

也可以通过ES5的Object.keys(myObject)获取对象的实例属性组成的数组,不包括原型方法和属性

image.png
        Object.prototype.method = function () {
            console.log(this);
        }
        var myObject = {
            a: 1,
            b: 2,
            c: 3
        }
        for (var key of Object.keys(myObject)) {
            console.log(key + ": " + myObject[key]);
        }
        console.log(Object.keys(myObject));
三、总结

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

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

3、遍历map对象时适合用解构,例如:

for (var [key, value] of phoneBookMap) {
   console.log(key + "'s phone number is: " + value);
}

4、当你为对象添加myObject.toString()方法后,就可以将对象转化为字符串,同样地,当你向任意对象添加myObjectSymbol.iterator方法,就可以遍历这个对象了。
举个例子,假设你正在使用jQuery,尽管你非常钟情于里面的.each()方法,但你还是想让jQuery对象也支持for-of循环,你可以这样做:

jQuery.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];

所有拥有Symbol.iterator的对象被称为可迭代的。在接下来的文章中你会发现,可迭代对象的概念几乎贯穿于整门语言之中,不仅是for-of循环,还有Map和Set构造函数、解构赋值,以及新的展开操作符。

5、for...of的步骤:for-of循环首先调用集合的Symbol.iterator方法,紧接着返回一个新的迭代器对象。迭代器对象可以是任意具有.next()方法的对象;for-of循环将重复调用这个方法,每次循环调用一次。举个例子,这段代码是我能想出来的最简单的迭代器:

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

来自

相关文章

  • &和&&,| 和 || 的区别

    &不管前面的条件是否正确,后面都执行 &&前面条件正确时,才执行后面,不正确时,就不执行,就效率而言,这个更好。 ...

  • &和&&, |和||的区别

    &和&&的含义一样, 表示逻辑与(and), 只有第一个表达式和第二个表达式都为 true 时, 整个运算结果才为...

  • &&和&,|和||的区别

    1 &&和&的区别 1 单&时,无论左边真假,右边都会进行计算 2 双&&时,只有左边为真时,右边才会进行计算,左...

  • null 和 undefined 的区别 ==和===的区别

    1.null 和 undefined 的区别 undefined 为变量未定义的值undefined表示"缺少值"...

  • is和 == 的区别

    为什么有时写代码 is 和 == 的结果相同,有的不相同呢? 分析: 官方文档中说 is 表示的是对象标示符(ob...

  • is和==的区别

    is 和 == 的区别 id()官网描述 def id(*args, **kwargs): # real sign...

  • *和**的区别

    **两个乘号就是乘方,比如2**4,结果就是2的4次方,结果是16 一个乘号*,如果操作数是两个数字,就是这两个数...

  • ${}和#{}的区别

    ${} 注入什么就是什么,且如果是简单类型的值需要用 value 来接收#{} 将传入的数据都当成一个字符串,会对...

  • is和==的区别

    is 是比较两个引用是否指向了同一个对象(引用比较)。 == 是比较两个对象是否相等。

  • .和..的区别

    .指的是当前目录; ..指的是上级目录; cd .. 进入上级目录 open ..打开上级目录; cd .进入本级...

网友评论

      本文标题:for in 和for of的区别

      本文链接:https://www.haomeiwen.com/subject/rladvktx.html