Javascript中for..of快速遍历对象时用到的迭代器到底是个啥?

1.有序与无序

  想要了解迭代器就不得不先谈一谈啥玩意儿是数据结构的顺序。数据结构中什么是顺序呢?不需要那么多乱七八糟的专业名词,我个人觉得大白话来说就是:数据在计算机里面存储的时候是一个一个挨着放的,而不是乱七八糟东一块西一坨。当然了你非要专业一点说的话大概可以这么来强行解释一波:

  •         有序:数据在计算机内存中所占用的空间,其对应的内存地址是连续的
  •         无序:数据在计算机内存中所占用的空间,其对应的内存地址是不连续的。

简单举个例子吧。还是以JavaScript中的数组和对象分别为例:

1.1. 数组

let arr = ['frank', 'luna', 'zoe'];

这玩意儿在内存里面大概存储方式就是下面这样的(ps:大概啊大概,意会就好)

这就叫内存地址是连续的,换句话说我们就说数组是一个有序的数据结构。

1.2. 对象(哈希表|散列表|关系映射表)

let obj = { 
  uname: "frank",
  uage: "18,
  umarried: false
};

而这玩意儿呢?在内存里面的存储放是下面这样的(ps:同样,意会,意会,毕竟JavaScript中的{}本质上也是采用数组的方式存储的,你要真细纠结这个东西就没意思了)

  这就叫内存地址是不连续的,因为虽然它的key和value分别都是连续存储,但这只是我举例时候用到的内容都是基本数据类型,如果是uage属性的value是一个数组呢?对吧,那就又另当别论了。

  而且你这么看,obj的key所占用的内存和value所占用的内存有没有必要连在一起?完全没有必要。因为每一个key值都保存了它对应的value的内存地址。换句话说你只要给我第一个key的内存地址,那么这个{}对象的所有内容我都找得到,至于你的value放在哪个角落和我没啥太大关系。

2.迭代器Iterator

  说过了有序和无序,那么可以来聊聊更进一步的东西了,比如什么叫遍历。那么啥是遍历呢?还是老规矩,通俗来说就是:有一捧豆干不知道有多少个,你一个一个把豆干吃掉,并且每吃一个就在纸上记下来这是第一个...这是第二个...直到把最后一个吃完。这个过程就叫遍历(我一直认为遍历这个词被创造出来的初衷就是为了装逼,从而让更多人听不懂这个意思,遍历不就是经历一遍的意思嘛),所以很明显,只有能被按照顺序数出来的东西才可以被遍历。如果我问你一块豆干都有啥特色(都有什么属性),你咋一个一个和我讲出来?先说有多辣?再说有多咸?最后说有多香?我还觉得你应该先说咸再说辣最后说香呢对不对?因为他们并没有一个客观的固有顺序,先讲哪一个都可以。所以也就不存在遍历的可能。

  嗯,好了如果你能明白这个意思那就妥了,我们可以继续向下。当然如果不明白也没啥问题,你去买一包豆干然后吃掉它们,体会体会。不行就再买一包,吃到你明白了或者吃到没钱买豆干了都行,反正最终金钱的压力会让你明白啥叫遍历的。(至于为啥是豆干,我哪知道,脑子里面突然想到的这谁控制得住对吧,领会精神就行)

  来我们继续,这个吃豆干的人也就是我被赋予了一个称号:吃豆人(大雾)</

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值