for in 和 for of 区别

218 阅读2分钟

for in 和 for of的区别

  1. for of

    描述:for...of语句可迭代对象(包括 ArrayMapSetStringTypedArrayarguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句

    for of是ES6新出的一个用于遍历可迭代对象(实现了Iterator接口)的语法

  2. for (variable of iterable) {
        //statements
    }
    //variable 每次迭代将不同的属性值分配给变量
     // iterable 被迭代枚举其属性对象
     
     
    
    //array
    let iterable = [10, 20, 30];
    
    for (let value of iterable) {
        value += 1;
        console.log(value);
    }
    // // 输出 11 21 31
    //string
    let iterable = "boo";
    
    for (let value of iterable) {
      console.log(value);
    }
    // b 0 0
    map
    set
    arguments
    ...
    
    
    
  3. forin

    for...in 语句以任意顺序迭代一个对象的除Symbol以外的可枚举属性,包括继承的可枚举属性。

    for (variable in object)
      statement
      //variable 每次迭代会被赋值为不同的属性名
       object 非symbol类型的可枚举属性被迭代的对象
       
       
       Object.prototype.objCustom = function() {};
    Array.prototype.arrCustom = function() {};
    
    let iterable = [3, 5, 7];
    iterable.foo = 'hello';
    
    // 会遍历原型链上的属性
    for (let i in iterable) {
      console.log(i); // logs 0, 1, 2, "foo", "arrCustom", "objCustom"
    }
    
    for (let i in iterable) {
        //hasOwnProperty 只判断对象自身属性,忽略从原型连上继承的属性
        //如果检测的属性值是null和undefined ,依旧会返回true
      if (iterable.hasOwnProperty(i)) {
        console.log(i); // logs 0, 1, 2, "foo"
      }
    }
    
    // of不会遍历原型链上的属性
    for (let i of iterable) {
      console.log(i); // logs 3, 5, 7
    }
    

​ 注意:

1.for in 应该用于迭代一个关注索引顺序的Array

2.如果你只要考虑对象本身的属性,而不是它的原型,那么使用 getOwnPropertyNames() 或执行 hasOwnProperty() 来确定某属性是否是对象本身的属性(也能使用propertyIsEnumerable)。或者,如果你知道不会有任何外部代码干扰,您可以使用检查方法扩展内置原型。

  1. 它是为了遍历对象而构建的,不建议与数组一起使用
  2. 可枚举对象属性是内部 ***可枚举标志位true***的属性
  3. or in循环只会对对象中的可枚举属性进行遍历,并且跳过属性名是Symbol类型的属性
  4. for in只会遍历对象本身上面的可枚举属性

参考:juejin.cn/post/719913…

主要的区别:

  1. for in 语句以任意顺序迭代对象的可枚举属性, 并且遍历非Symbol 类型键以及对象自身可枚举的属性

​ 2.for of 适用于实现了Iterator接口的对 象(也称作可迭代对象)的遍历其遍历方式由自身实现,对于数组是遍历其下标值,对于Map遍历值为键值对组成的数组