for...of 与 for...in 区别究竟在哪里呢?

107 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情

很多时候我们差的只是再坚持一下。

for...of 与 for...in在我们的程序中被大量使用,我们都知道对于对象、数组,我们可以使用for...in,对于map、set我们可以使用for...of,那么他们之间的差别是什么呢?

对比

key和value的差别

  • for...in 遍历得到的是key; key是字符串格式,所以对于遍历数组得到的key无法直接相加
  • for...of 遍历得到的是value; 来看一下代码

适用于不同的数据类型

  • 遍历对象:for...in可以,for...of不可以

  • 遍历Map、Set:for...of可以,for...in不可以

  • 遍历generator:for...of可以,for...in不可以

for...in遍历你会发现其能够将原型方法和属性也遍历出来,这有时候会对我们的遍历结果造成影响,这个时候呢,我们就需要使用hasOwnProperty()方法进行一下判断。

可枚举对比可迭代

  • for...in用于可枚举的数据:对象、数组、字符串的 这里我们需要用到Object.getOwnPropertyDescriptors方法

截屏2022-04-19 23.28.43.png

只要enumerable: true就说明是可枚举的

  • for...of用于可迭代的数据:数组、字符串、Set、Map
    这里我们需要借助Symbol.iterator这个属性或者称之为方法

截屏2022-04-19 23.33.40.png

执行该方法后,你会发现其中存在一个next方法或属性,这就说明其是可迭代的

总结

for...of 与 for...in的对比,最后还是要看是否对可枚举和可迭代有比较深刻的理解,如果只是单纯的江答案背下来,能够解决常见问题,但只是浮于表面。如果你对这二者的对比有兴趣,可以按照本文的思路重新梳理一遍,将代码敲一遍,我相信会有新的理解。