为了获得Object中的方法或属性,就不得不用到for in来遍历。

<script>

var eObj={

“a”:1,

“b”:2

}

for(var i in eObj){

console.log(i);

}

</script>

结果,输出a,b

同样的,for in 也会枚举出[[prototype]]中的属性

<script>
var fn=function(){}
fn.prototype.e=1;
fn.prototype.f=2;
var obj=new fn();
for(var i in obj){
console.log(i);
}
</script>
obj的属性来自于fn.prototype,依然可以被枚举到
结果e,f
然后看下面一种情况。。
枚举的过程中,删除属性。。。
obj={e:1,f:2,g:3};
for(var i in obj){
if(i==”e”){
delete obj.g;
}
console.log(i);
}
在for in的过程中,删除了其中的一个属性g,则被删除的属性不会被枚举出。。
结果是:e,f
那么,如果删除的是已经被枚举到的属性呢?
obj={e:1,f:2,g:3};
for(var i in obj){
if(i==”f”){
delete obj.e;
}
console.log(i);
}
结果:e,f,g
结果出现变化了。虽然到f的时候删除了属性e,但是e依然被枚举出来。
那么,再增加一个属性会怎么样呢?
<script>
obj={e:1,f:2,g:3};
for(var i in obj){
if(i==”f”){
obj.h=4;
}
console.log(i);
}
</script>
结果:e,f,g
增加的h没有被枚举出。。
这说明,在for in过程中,如果删除了已经被枚举出的属性,则枚举的集合中依然会存在这个属性名称;如果删除的是尚未被枚举出的属性,则这个属性就不会被加入到集合。如果是增加一个属性,就不会被枚举出。