Frage IE8-Bug in einer JavaScript-Anweisung?


Ich denke, ich habe einen Fehler in der IE (IE8) -Behandlung für die for-in Javascript-Anweisung gefunden. Nach einigen Stunden des Aufkochens auf ein kleines Beispiel sieht es so aus, als ob IE jede Eigenschaft namens "toString" in einer For-In-Schleife überspringt - unabhängig davon, ob es sich um einen Prototyp oder um eine "Eigene Eigenschaft" des Objekts handelt.

Ich habe meine platziert Testcode hier:

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;
}

Dies sollte produzieren:

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

Aber im IE bekomme ich:

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

Diese spezielle Hülle einer Eigenschaft, die 'toString' heißt, zerstört meinen Code, der versucht, Methoden in einen Function.prototype zu kopieren - meine benutzerdefinierte toString-Funktion wird immer übersprungen.

Kennt jemand einen Work-around? Ist das eine Art Quark-Modus nur Verhalten - oder nur ein Fehler?


9
2017-09-14 00:35


Ursprung


Antworten:


Ja, es ist ein Fehler. Sehen diese Antwort.

Zitieren CMS:

Ein weiterer bekannter JScript-Bug ist der "DontEnum Bug", wenn ein Objekt in seiner Scope-Kette eine Eigenschaft enthält, die nicht aufzählbar ist (hat das {DontEnum} -Attribut), bleibt die Eigenschaft bei einem anderen Objekt schattiert, bleibt sie aufzählbar, zum Beispiel:

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

Es wird im IE als false ausgewertet, was Probleme bei der Verwendung der for-in-Anweisung verursacht, da die Eigenschaften nicht aufgerufen werden.


10
2017-09-14 00:42



Dies ist ein Fehler im IE und gilt auch für benannte Eigenschaften valueOf.

Du kannst es so umgehen:

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

2
2017-09-14 00:57