2011-05-27 16 views
7

Estaba hablando de hasOwnProperty con otro desarrollador y de cómo se supone que debes usarlo en los bucles for-in de javascript y tenía una buena pregunta. Cuando haces un ciclo for-in, ¿por qué no aparecen en el ciclo toString, hasOwnProperty y otros métodos integrados?¿Por qué no se muestran toString y hasOwnProperty (etc) en bucles for-in en JavaScript?

+3

Estoy bastante seguro de que estos métodos tienen el atributo * enumerable * interno establecido en 'false' pero no puedo encontrar ninguna referencia. Tal vez porque 'Object.prototype' está marcado de esta manera. Consulte http://ecma262-5.com/ELS5_HTML.htm#Section_15.2.3 –

+0

@Felix: esa es exactamente la respuesta. – Spudley

+1

@Felix, http://javascriptweblog.wordpress.com/2011/01/04/exploring-javascript-for-in-loops/. Haz que una respuesta. – hyperslug

Respuesta

5

El ECMAScript define varias propiedades para cada propiedad encontrada en objetos como en prototipos. Una de estas es la propiedad enumerable, y si está configurada en false, esa propiedad se omitirá.

realidad puede manipular estas propiedades mediante la función defineProperty:

Este método permite la adición precisa o modificación de una propiedad en un objeto. La adición normal de propiedades a través de la asignación crea propiedades que aparecen durante la enumeración de la propiedad (para ... en el ciclo), cuyos valores pueden modificarse y pueden eliminarse. Este método permite que estos detalles adicionales se cambien de sus valores predeterminados.

0

Tal vez me entienden mal su pregunta, pero aquí es un ejemplo de hasOwnProperty trabajar desde el interior de un bucle for-in:

var i,o={some:"thing"};for(i in o)alert(o.hasOwnProperty("some")); 
+0

No estoy preguntando cómo usarlo, estoy diciendo que obviamente es miembro de todos los prototipos de objetos pero nunca aparece en un ciclo for-in. Lepidosteus tiene la respuesta correcta. –

+0

Parece que no entendí ... @Felix tiene razón. – ic3b3rg

+0

np, no es una pregunta normal de hasOwnProperty :) –

4

Es por especificación

Un bucle for ... in hace no iterar sobre propiedades integradas. Estos incluyen todos los métodos integrados de objetos , como String's indexOf method o Object's toString method. Sin embargo, el bucle iterará sobre todas las propiedades definidas por el usuario (incluidas las que sobrescriben las propiedades incorporadas).

De Mozilla Developer Network page on for..in

Se basa internamente en el atributo numerable de estas propiedades, como se puede comprobar en el EcmaScript specification (búsqueda de "for-in", el atributo "numerable" se describe la página 30)

4

Estoy bastante seguro de que estos métodos tienen el [[Enumerable]] atributo interno establece en false pero no puedo encontrar nada donde así se indique expresamente.

Actualización: Aparentemente, no enumerable es la configuración predeterminada para las propiedades definidas en la especificación (si no se especifica lo contrario) (consulte la tabla 7 en el siguiente enlace).

Puede encontrar más información acerca de estos atributos en la especificación: Property attributes:

Si true, la propiedad será separado por una for-in enumeración (ver 12.6.4). De lo contrario, se dice que la propiedad no se puede enumerar.

+0

Simplemente descargue el PDF de ECMAScript y busque; hay muy pocas versiones HTML del documento y el ECMA no mantiene una versión de este tipo. –

+0

@Martijn: lo eché un vistazo. Pero la especificación de estos métodos no indica que este atributo se establezca en falso. Tal vez está escrito en algún lugar en el texto. –

+0

Sección 8.6.1, tablas 5 a 7 (esta última define los valores predeterminados). –

1

Las propiedades integradas no son enumerables, por lo tanto toString y hasOwnProperty no son enumerables. En ECMAScript 3, todos los métodos o propiedades definidos por el usuario son enumerables.En ECMAScript 5 puede elegir si el método o la propiedad serían enumerables.

Cuestiones relacionadas