for...in和for...of的介绍及区别

前端印记

共 2557字,需浏览 6分钟

 ·

2021-10-12 11:55

for...in

任意顺序遍历一个对象自有的、继承的、可枚举[1]的、非Symbol的属性。对于每个不同的属性,语句都会被执行(MDN)

简单来说下图:就是for...in是无序遍历,有可能遍历数组的时候,不能保证顺序是正常的取出来。所以不推荐用for...in遍历数组类型值

for...in循环有几个缺点[2]

  1. 数组的键名是数字,但是for...in循环是以字符串作为键名"0"、"1"、"2"等等。
  2. for...in循环不仅遍历数字键名,还会遍历手动添加的其他键,甚至包括原型链上的键。
  3. 某些情况下,for...in循环会以任意顺序遍历键名。
  4. for...in循环只能获得对象的键名,不能直接获取键值
尽量不要用for in遍历数组

集合遍历的效率为:hash > for(;;) > for...in
集合相关操作首选对象,次之用for循环遍历。

for...of

for...of是遍历所有数据结构的统一的方法,但是只能遍历具有iterator迭代接口的值。因for...of循环内部调用的是数据结构的Symbol.iterator方法。

for...of循环可以使用的范围包括:

数组、Set 和 Map 结构、某些类似数组的对象(比如arguments对象、DOM NodeList 对象)、后文的 Generator 对象,以及字符串。

原生Object没有这个接口,默认是不能用for...of进行遍历的,会报错:

不同点

  • for...in可以遍历对象,for...of不可以;
  • for...in循环读取键名,for...of循环读取键值;
  • for...in不适用于遍历数组,原因如下一条。
  • for...of循环调用遍历器接口,这一点跟for...in循环也不一样。所以遍历数字集合的数组时,for...in返回字符串,for...of返回的是数字。

  • let arr = [35];

    for (let i in arr) {
      console.log(i); // 字符串类型的键名:'0', '1'
    }

    for (let i of arr) {
      console.log(i); // 数字类型的值:3, 5
    }

性能比较:

for/while > forEach等(函数式编程+for) > for...of > for...in

参考资料

[1]

可枚举的: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Enumerability_and_ownership_of_properties

[2]

es6文档关于for...in相关知识: https://es6.ruanyifeng.com/#docs/iterator#for---of-%E5%BE%AA%E7%8E%AF




愿你历尽千帆,归来仍是少年。


让我们一起携手同走前端路!

关注公众号回复【加群】即可

● 工作中常见页面布局的n种实现方法

● 三栏响应式布局(左右固宽中间自适应)的5种方法

● 两栏自适应布局的n种实现方法汇总

● 工作中常见的两栏布局案例及分析

● 垂直居中布局的一百种实现方式

● 常用九宫格布局的几大方法汇总

● 为什么操作DOM会影响WEB应用的性能?

● 移动端滚动穿透的6种解决方案

● Vue + TypeScript 踩坑总结

浏览 58
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报