代码之家  ›  专栏  ›  技术社区  ›  mckoss

IE8在javascript语句中插入for?

  •  9
  • mckoss  · 技术社区  · 14 年前

    我想我在IE(IE8)处理for-in-javascript语句时发现了一个错误。经过几个小时的煮成一个小例子,它看起来像是专门跳过了一个for-in循环中任何称为“toString”的属性——不管它是在原型中还是对象的“自有属性”。

    我把我的 test code here :

    function countProps(obj) {
        var c = 0;
        for (var prop in obj) {
            c++;
        }
        return c;
    }
    
    var obj = {
        toString: function() {
            return "hello";
        }
    };
    
    function test() {
        var o = "";
        var d = document.getElementById('output');
    
        o += "<br/>obj.hasOwnProperty('toString') == " + obj.hasOwnProperty('toString');
        o += "<br/>countProps(obj) = " + countProps(obj);
        o += "<br/>obj.toString() = " + obj.toString();
    
        d.innerHTML = o;
    }
    

    这将产生:

    obj.hasOwnProperty('toString') == true
    countProps(obj) = 1
    obj.toString() = hello
    

    但在IE中,我得到:

    obj.hasOwnProperty('toString') == true
    countProps(obj) = 0
    obj.toString() = hello
    

    任何名为“ToString”的属性的这种特殊大小写破坏了我试图将方法复制到函数中的代码。原型-我的自定义ToString函数总是被跳过。

    有人知道周围有工作吗?这是某种怪癖模式的行为——还是仅仅是一个bug?

    2 回复  |  直到 11 年前
        1
  •  10
  •   Community CDub    8 年前

    是的,这是一只虫子。见 this answer .

    引用 CMS :

    另一个众所周知的JScript bug是“dontenum bug”,如果其作用域链中的对象包含不可枚举的属性(具有dontenum属性),如果该属性隐藏在其他对象上,则它将保持为不可枚举,例如:

    var dontEnumBug = {toString:'foo'}.propertyIsEnumerable('toString');
    

    在IE上,它的值将为false,这会导致在使用for-in语句时出现问题,因为不会访问属性。

        2
  •  2
  •   SLaks    14 年前

    这是IE中的一个错误,也适用于名为 valueOf .

    你可以这样做:

    if(obj.toString !== Object.prototype.toString || obj.hasOwnProperty("toString"))
        //Handle it
    if(obj.valueOf !== Object.prototype.valueOf || obj.hasOwnProperty("valueOf"))
        //Handle it