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?
Respuesta
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.
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"));
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. –
Parece que no entendí ... @Felix tiene razón. – ic3b3rg
np, no es una pregunta normal de hasOwnProperty :) –
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)
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.
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. –
@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. –
Sección 8.6.1, tablas 5 a 7 (esta última define los valores predeterminados). –
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.
- 1. Javascript ¿cuál es la propiedad en hasOwnProperty?
- 2. for..in y hasOwnProperty
- 3. ¿Por qué este 'por (;;)' bucles?
- 4. ¿Por qué no puedo proyectar ToString() en VB?
- 5. git: ¿Por qué no se muestran las diferencias?
- 6. ¿Por qué las imágenes y CSS no se muestran en HTTPS?
- 7. ¿Por qué usar bucles infinitos?
- 8. javascript equivalente de join() y toString() en C#?
- 9. ¿Qué son GeneratedMethodAccessor1,2, etc. y por qué no se pueden encontrar?
- 10. ¿Por qué Javascript algunas veces no se carga en IE8?
- 11. ¿por qué no deberíamos usar ++ en javascript?
- 12. ¿Por qué ToString() redondea mi doble valor?
- 13. No se muestran imágenes en Spring MVC
- 14. ¿Por qué Moq no ejecuta el método ToString reemplazado?
- 15. ¿Por qué el borde de <th> y <thead> no se muestran aquí?
- 16. ¿Por qué las fuentes personalizadas generalmente no se muestran correctamente en iOS?
- 17. No se puede invocar toString() en el tipo primitivo int
- 18. ¿Por qué los hipervínculos a veces no se muestran en NSTextField con NSAttributedString?
- 19. Uso de toString() en lugar de constructor en JavaScript
- 20. ¿Por qué UISearchBar y sus botones de alcance se muestran en una línea?
- 21. Imágenes precargadas que no se muestran en Chrome
- 22. Agregue diferentes delimitadores en javascript toString() ..?
- 23. JavaScript - al lado de toString()?
- 24. de Javascript .toString (16) en PHP
- 25. Errores de pepino suprimidos (no se muestran por completo)
- 26. ¿Cómo depurar javascript cuando entra en bucles infinitos y llamadas recursivas en Javascript?
- 27. En Flask, ¿por qué se muestran todas las vistas en un solo archivo?
- 28. ¿Por qué no hay continuidad de línea implícita de python en 'y', 'o', etc.?
- 29. ¿Por qué Google usa JavaScript y CSS en línea?
- 30. Seleccionar opciones que no se muestran en IE
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 –
@Felix: esa es exactamente la respuesta. – Spudley
@Felix, http://javascriptweblog.wordpress.com/2011/01/04/exploring-javascript-for-in-loops/. Haz que una respuesta. – hyperslug