看完这篇,你就知道 for、for-in、for-of 该怎么选了

23 阅读4分钟



那是一个很普通、但又很不普通的夜晚。晚上 10 点,公司灯没关,咖啡机还在嗡嗡作响,我盯着屏幕里的 JavaScript 代码,心里只有一个念头: “我要把这一堆数据,全都走一遍。”

产品经理给我甩过来一个需求:“把用户列表、配置对象、后端返回的数据,全都处理一遍,别漏,别错。”

我一看数据结构,心里一紧:

  • 有数组
  • 有对象
  • 还有 Map、Set

这时候,代码世界里走出来了三位老熟人,拍了拍我的肩膀:

  • for:老实本分的体力活巡逻兵
  • for-in:专查“房产证”的对象管理员
  • for-of:新时代的优雅漫步者

他们说:“小米,别慌,我们三个,正好管这一摊。”

for 语句:最老牌的“体力型巡逻兵”

1、for 是谁?

如果 JavaScript 是一座城市,那 for 循环,就是最早上岗的巡逻员。他不花哨、不智能,但特别靠谱。

你告诉他三件事:

  1. 从哪开始
  2. 什么时候停
  3. 每一步怎么走

他就一步一步,数着步子给你走完。

2、for 的工作方式,用生活比喻一下

想象你在操场跑步:

  • 起点:i = 0
  • 终点:i < 5
  • 每跑一圈:i++

for 就是那个:“跑完一圈就低头看一眼表,再决定要不要继续跑的人。”

3、for 遍历数组:体力活,但精准

优点很明显:

  • 能控制下标
  • 能中途 break、continue
  • 想怎么跳怎么跳

缺点也很明显:

  • 写起来累
  • 容易写错下标
  • 一不小心就 i <= length,直接翻车

4、什么时候用 for?

我的经验是:

for 更像是 “手动挡” ,懂的人很爽,新手容易熄火。

for-in:对象世界的“房产管理员”

1、for-in 是干嘛的?

有一天,for-in 走过来跟我说:“数组的事你们聊,我只管对象的属性。”

for-in 不关心值排成什么顺序,他只在乎一件事: “这个对象名下,都有哪些属性?”

2、for-in 的本质:遍历“可枚举属性”

简单来说就是:

  • 它遍历的是 key
  • 包括对象自己 + 原型链上的

这点非常重要。

输出:

这时候 for-in 就像一个查房的管理员:“你家名下的房子,我全都能查到,包括继承来的。”

3、for-in 用在数组?——容易踩坑

看起来没问题,但风险很大:

  • index 是字符串 "0"、"1"
  • 会遍历自定义属性
  • 顺序不保证

所以一句话总结:for-in 天生是给对象用的,不是给数组用的。

4、for-in 的适用场景

for-of:新时代的“优雅漫步者”

1、for-of 出场,自带光环

ES6 之后,for-of 登场了。他走路不急不慢,语气温柔:“你不用管下标,我直接给你值。”

不是瞬间清爽了?

2、for-of 的秘密:迭代器(Iterator)

for-of 不是什么都能遍历。他只认一类东西:可迭代对象(Iterable)

比如:

  • Array
  • String
  • Map
  • Set
  • arguments
  • NodeList

for-of 更像一个散步的人:“这条路怎么铺的我不管,我只管一步步往前走。”

3、 for-of vs for-in,差在哪?

一句话总结:for-in 看产权证,for-of 拿实物。

4、for-of + break:既优雅又强大

不像 forEach 那样“停不下来”,for-of 依然保留了 break / continue 的自由。

三个 for,怎么选?我的真实经验

我把它们想象成三种交通工具:

  • for:手动挡轿车
  • for-in:房管局系统
  • for-of:自动驾驶电车

选型口诀送你一份:

  • 要下标,用 for
  • 要对象 key,用 for-in
  • 要值、要优雅,用 for-of

面试官最爱问的灵魂三连击

Q1:for-in 和 for-of 的核心区别?

答:

  • for-in 遍历:可枚举属性名
  • for-of 遍历:迭代器返回的值

Q2:为什么不推荐用 for-in 遍历数组?

答:

  • 顺序不保证
  • 下标是字符串
  • 会遍历自定义属性

Q3:for-of 能不能遍历对象?

答:

不能,除非对象实现了迭代器。

总结

那天晚上,我带着 for、for-in、for-of,把需求里的数据一个不落地处理完。关灯走人前,我突然意识到一件事:JavaScript 的循环不是多,而是各司其职。

真正的高手,不是把所有循环写成 for,而是知道:

  • 什么时候该用谁
  • 为什么用它

END

如果你也曾在数组和对象之间迷茫过,希望这篇故事,能帮你在代码世界里少走点弯路。

我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!

我们,下篇见~