9

Creo que he encontrado un error en el manejo de IE (IE8) para la declaración de javascript for-in. Después de varias horas de reducir esto a un pequeño ejemplo, parece que IE omite específicamente cualquier propiedad llamada "toString" en un bucle for-in, independientemente de si está en un prototipo o si es una "Propiedad propia" del objeto.IE8 error en la declaración de JavaScript for-in?

he puesto mi 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; 
} 

Esto debería producir:

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

pero en IE, estoy recibiendo:

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

Esta carcasa especial de cualquier propiedad llamada 'toString' está causando estragos en mi código que intenta copiar métodos en un Function.prototype - mi cu La función stom toString siempre se omite.

¿Alguien sabe una alternativa? ¿Es esto una especie de comportamiento exclusivo del modo peculiar, o simplemente un ERROR?

Respuesta

10

Sí, es un error. Ver this answer.

Citando CMS:

Otro bug JScript bien conocido es el "Bug DontEnum", si un objeto en su cadena de alcance contiene una propiedad que no es enumerable (tiene el atributo {DontEnum}), si la la propiedad es sombreado en otro objeto, se mantendrá como no numerable, por ejemplo:

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

se evaluará a falso en IE, esto causa problemas cuando se utiliza el para-i n enunciado, porque las propiedades no serán visitadas.

+1

Gracias por citar mi respuesta, voy a publicar alguna solución al problema en el otro hilo -y tal vez más bugs- aplicación;) Gracias – CMS

+0

. Por lo tanto, al contrario de las especificaciones de JavaScript, este es un caso en el que una propiedad definida por el usuario no es enumerable. ¿Hay una lista de todas esas propiedades para que pueda agregar una prueba especial a mi código cuando dontEnumBug es verdadero? – mckoss

+0

He actualizado mi código de prueba: http://startpad.googlecode.com/hg/labs/js/misc/tostring.html un trabajo en torno debe probar específicamente la presencia de propiedades con nombre: toString, toLocaleString, valueOf , constructor e isPrototypeOf, de mis pruebas de IE8. – mckoss

2

Esto es un error en IE, y también se aplica a las propiedades llamadas valueOf.

puede solucionar de esta manera:

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

Se aplica a otros también. Aquí hay una lista: https://developer.mozilla.org/en/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug –

+0

tenía el mismo problema con includes. if (obj.includes! == Object.prototype.includes || obj.hasOwnProperty ("includes")) { // handleit } –

Cuestiones relacionadas