浏览 2920 次
锁定老帖子 主题:for in的缺陷
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-09
最后修改:2011-01-16
for in 语句用来列举对象的属性(成员),如下 var obj = { name:"jack", getName:function(){return this.name} }; //输出name,getName for(var atr in obj) { alert(atr); } 不知注意了吗,没有输出obj的toString,valueOf等内置属性(或称内置成员,隐藏属性和预定义属性)。即for in用来列举对象的显示成员(自定义成员)。
如果重写了内置属性呢,下面就重写obj的toString var obj = {name:"jack", getName:function(){return this.name}, toString:function(){return "I'm jack."} }; for(var atr in obj) { alert(atr); }
会输出什么呢? 1、IE6/7/8 下和没有重写toString一样,输出name,getName 2、firefox3/chrome2/opera9/safari4下则输出name,getName,toString
总结下:在跨浏览器的设计中,我们不能依赖于for in来获取对象的成员名称。即使用,要小心谨慎。
2010-9-24 IE9 beta重写后可遍历,如{toString:function(){}}
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-06-10
最后修改:2009-06-10
在Javascript 中 object 的 toString() ,toLocalString(),valueOf(),hasOwnProperty(),isPrototypeOf(),
propertyIsEnumerable() 都是不能枚举的内置方法。在 for in 语句中不能遍历到这些方法属性,不要依赖for in alert({x:1}.propertyIsEnumerable('toString')); |
|
返回顶楼 | |
发表时间:2009-06-11
yiminghe 写道 在Javascript 中 object 的 toString() ,toLocalString(),valueOf(),hasOwnProperty(),isPrototypeOf(),
propertyIsEnumerable() 都是不能枚举的内置方法。在 for in 语句中不能遍历到这些方法属性,不要依赖for in alert({x:1}.propertyIsEnumerable('toString')); 嗯。基本上如此。 有一点,在重写对象的toString后,各引擎表现就不一样了。 IE6,7,8仍然不列举toString,但firefox,chrome,opera,safari会列举toString. |
|
返回顶楼 | |
发表时间:2009-06-11
看来是ie下覆盖内置方法并不会修改方法的可枚举性。
|
|
返回顶楼 | |