for-in JavaScript语句中的IE8错误?

mck*_*oss 9 javascript internet-explorer prototype quirks-mode internet-explorer-8

我想我已经在IE(IE8)处理for-in javascript语句中发现了一个错误.经过几个小时的煮沸这个小例子后,看起来IE特意在for-in循环中跳过任何名为"toString"的属性 - 无论它是在原型中还是对象的"自有属性".

我把测试代码放在这里:

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;
}
Run Code Online (Sandbox Code Playgroud)

这应该产生:

obj.hasOwnProperty('toString') == true
countProps(obj) = 1
obj.toString() = hello
Run Code Online (Sandbox Code Playgroud)

但在IE中,我得到:

obj.hasOwnProperty('toString') == true
countProps(obj) = 0
obj.toString() = hello
Run Code Online (Sandbox Code Playgroud)

这个名为'toString'的属性的特殊大小写破坏了我的代码,试图将方法复制到Function.prototype中 - 我的自定义toString函数总是被跳过.

有没有人知道解决方法?这是某种怪癖模式的行为 - 还是只是一个BUG?

Cri*_*hez 10

是的,这是一个错误.看到这个答案.

引用CMS:

另一个众所周知的JScript错误是"DontEnum Bug",如果其作用域链中的对象包含不可枚举的属性(具有{DontEnum}属性),如果该属性在其他对象上被遮蔽,则它将保持为非可枚举的,例如:

var dontEnumBug = {toString:'foo'}.propertyIsEnumerable('toString');
Run Code Online (Sandbox Code Playgroud)

它将在IE上评估为false,这会在使用for-in语句时导致问题,因为不会访问属性.