for ... in 和 for ... of 的区别

for ... in 的特点

  • for ... in 循环返回的值都是数据结构的 键值名
    遍历对象返回的对象的key值,遍历数组返回的数组的下标(key)。

  • for ... in 循环不仅可以遍历数字键名,还会遍历原型上的值和手动添加的其他键。

  • 特别情况下, for ... in 循环会以任意的顺序遍历键名

总结: for in 循环特别适合遍历对象。

for ... of 的特点

  • for of 循环用来获取一对键值对中的值,而 for in 获取的是 键名

  • 一个数据结构只要部署了 Symbol.iterator 属性, 就被视为具有 iterator接口, 就可以使用 for of循环。

  • for of 不同与 forEach, 它可以与 break、continue和return 配合使用,也就是说 for of 循环可以随时退出循环。

  • 提供了遍历所有数据结构的统一接口

哪些数据结构部署了 Symbol.iteratoer属性了呢?

只要有 iterator 接口的数据结构,都可以使用 for of循环。

  • 数组 Array
  • Map
  • Set
  • String
  • arguments对象
  • Nodelist对象, 就是获取的dom列表集合

以上这些都可以直接使用 for of 循环。 凡是部署了 iterator 接口的数据结构也都可以使用数组的 扩展运算符(...)、和解构赋值等操作。

下面举几个例子:

例1:
const obj = { 
  a: 1,
  b: 2,
  c: 3 
};
for (let i in obj) { 
  console.log(i)
  // a  
  // b  
  // c 
} 
for (let i of obj) { 
  console.log(i) 
  // Uncaught TypeError: obj is not iterable 报错了
 }

以上代码通过 for in 和 for of 对一个obj对象进行遍历,for in 正常的获取了对象的 key值,分别打印 a、b、c,而 for of 却报错了。原因是例1中的对象没有 iterator接口,但是我也想让对象可以使用 for of循环怎么办?使用 Object.keys() 获取对象的 key值集合后,再使用 for of

const obj = { 
  a: 1,
  b: 2,
  c: 3 
};

// 当然,如果要取key值的话使用 for ... in 是更好的选择
for ( let i of Object.keys(obj)) {
  console.log(i)
  // 1
  // 2
  // 3
}

也可以给一个对象部署 Symbol.iterator属性

例2:

以上是遍历对象,下面再看一个遍历数组的例子。

const arr = ['a', 'b', 'c'] 
// for in 循环  
for (let i in arr) { 
  console.log(i)
   // 0 
   // 1
   // 2 
} 
// for of  
for (let i of arr) { 
  console.log(i)
  // a  
  // b  
  // c
}
例3:
const arr = ['a','b']
// 手动给arr数组添加一个属性
arr.name = 'qingyu'

// for in 循环可以遍历出name这个键名
for (let i in arr) {
  console.log(i)
  // a
  // b
  // name
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。