您的位置:首页 > Web前端 > JavaScript

【javascript基础】之【IE著名bug——如果某个实例属性与标为[[DontEnum]]的某个属性同名,那么该实例属性不会出现在for in】

2012-05-21 14:54 337 查看
【题记】每次看《javascript高级程序设计》第九章第二节的“怪癖检测”的时候,看到IE的bug,看一下,知道有这么一个东西,因为实际项目中还没有用到这个,今天再看,势必要把这个搞清楚。

【正文】如果某个实例属性与标为[[DontEnum]]的某个属性同名,那么该实例属性不会出现在for in,

测试

<div id="txt"></div>

<script>

var arr = {

"first":1,

"second":2,

"third":3,

toString : function(){},

valueOf : function(){},

constructor : 11,

hasOwnProperty : function(){},

isPrototypeOf : function(){}

/* propertyIsEnumerable : function(obj){

}*/

};

var txt = document.getElementById("txt");

var str = "";

for(var o in arr){

str += o + "'s [[DontEnum]] is " + arr.propertyIsEnumerable(o) + "<br />" ;

}

txt.innerHTML = str;

</script>

结果如下,IE9,firefox,chrome,safari,opera都显示如下:



而IE8,6,7显示如下:



可见,IE9已经修复了这个bug, IE8以及版本以下的bug依然存在,同时,被打上[[DontEnum]]的属性有:toString,valueOf,constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable

最后,检测这个bug就更简单了,
var isDontEnum = (function(){
for (var p in { toString: 1 }) {
if (p === 'toString') return false;
}
return true;
})();

那么,如何修复这个BUG呢?

/*@cc_on if(o.toString!=={}.toString){
// doStuff ... for example
alert(o.toString);
}@*/ Dean Edwards

/*@cc_on
if(o.toString!==Object.prototype.toString){
// doStuff
}
if(o.valueOf!==Object.prototype.valueOf){
// doStuff
}
@*/ 参考:

http://webreflection.blogspot.com/2007/07/quick-fix-internet-explorer-and.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐