对于非数组对象,遍历方法似乎只有使用for-in循环,但是使用for-in会遍历出一些意料之外的东西,请看下面这些现象:
Object.cre = 'Obj.cre';
Object.prototype.abc = 'Obj-abc';
Object.prototype.bcd = 'Obj-bcd';
Function.prototype.abc = 'Fn-abc';
Function.prototype.bcd = 'Fn-bcd';
Function.prototype.test = 'Fn-test';
var k,
o = {},
f = function(){};
f.prototype.abc = 'f-abc';
f.prototype.cde = 'f-cde';
f.test = 'f.test';
for(k in o){
alert(o[k]); //依次弹出Obj-abc、Obj-bcd
//o.hasOwnProperty(k) && alert(o[k]); //无弹出
}
alert('br1');
for(k in f){
alert(f[k]); //依次弹出f.test、Fn-abc、Fn-bcd
//f.hasOwnProperty(k) && alert(f[k]); //弹出f.test
}
var fp = f.prototype;
alert('br2');
for(k in fp){
alert(fp[k]); //依次弹出f-abc、f-cde、Obj-bcd
//fp.hasOwnProperty(k) && alert(fp[k]); //依次弹出f-abc、f-cde
}
所以,为了保证遍历结果在我们的预期之内,for-in一定要使用hasOwnProperty进行判断,而对于数组遍历一定不要使用for-in。
所以个人强烈反对对原生Object、Function等的prototype进行扩展!