for in 实验出的小机制

那么问题来了,为什么第二次遍历时,能打印出来c,却不能打出来c的内容呢?

A同学辩解:如果第一次循环o被a覆盖了,那么现在循环条件里的o应该指的a吧,所以c被打印出来都不应该呢?

B同学:o只是被覆盖了。

A同学继续辩解:但是o有两个对象,如果循环时o被覆盖,是不可能打印出来c的。

B同学:所以只能说for in循环一开始就把o分解了,自个存好,自个等待运行。

C同学有点不耐烦:行了,咱们再做做实验吧。

A同学有点小落寞:o都没了还能打印,看来确实是执行了两次。

C同学安慰:别急,干脆看看for循环的条件。

B同学:看来for循环时,一旦arr1.length=0,循环立即终止,说明for循环每次遍历,都对arr1.length进行了重新判断 。

B同学见大家沉默:这能否说明for in循环里,循环的次数在刚开始循环的时候就判定了,一旦循环开始,for in循环次数不受其他因素影响。

A同学终于开口:你是说,for in循环只在初始的时候对Object进行判定 。对,这两个循环机制本来就不一样。

C同学:也就是说,for in一开始,就把所有的属性都给存起来了,并且确定好循环次数;那么在第二次循环的时候,还是能打印出来c,但是此时o已经被a:{b:1}覆盖了,a里面是没有c这个属性的,所以能打印出来c的内容才怪嘞。

D同学:还是感觉不对,再做个小实验看看吧。

D同学:然后打印的话,外层循环进来的时候存一下o就行了,不影响循环,但也可以取值。

B同学:这是个双层循环,外层循环进来,内层循环执行到第二次,o是undefined了,外层循环执行一次,不会有第二次了。

二师弟说:你怎么看呢?

 

原文地址:https://www.cnblogs.com/miniSkytrue/p/12333488.html