Estoy trabajando en este animation function pero tengo un problema. Parece que no puedo realizar lo que debería ser una tarea fácil, no puedo obtener la longitud de un objeto. Si echas un vistazo a jsFiddle, puedes ver que estoy ejecutando alert(properties.length);
y está devolviendo undefined
. ¿Alguien puede ver por qué esto podría ser?JavaScript literal longitud del objeto === undefined?
Respuesta
objeto JavaScript simplemente hacer no tienen una propiedad length
, solamente Arrays
lo hacen. Si desea saber la cantidad de propiedades definidas en un objeto, debe iterar sobre ellas y contarlas.
Además, el bucle for in
es propenso a errores debido extensión del Object.prototype
ya que en atravesará la completa cadena de prototipo y enumerar todas las las propiedades que están en la cadena.
Ejemplo
// Poisoning Object.prototype
Object.prototype.bar = 1;
var foo = {moo: 2};
for(var i in foo) {
console.log(i); // logs both 'moo' AND 'bar'
}
Tienes que utilizar el método hasOwnProperty en el objeto con el fin de filtrar estas propiedades no deseadas.
// still the foo from above
for(var i in foo) {
if (foo.hasOwnProperty(i)) {
console.log(i); // only logs 'moo'
}
}
Muchos frameworks de JavaScript por ahí extienden el prototipo, no usar hasOwnProperty
a menudo conduce a errores horribles.
actualización
Con respecto al problema real que su código no es la animación ambas propiedades.
for(var p in properties) {
...
for(var i = 0; i <= frames; i++)
{
setTimeout((function(exti, element) {
return function() {
// p gets overriden by for outer for in loop
element.style[p] = original + (pixels * exti) + 'px';
}
// you need to pass in a copy of the value of p here
// just like you do with i and element
})(i, element), i * (1000/60), element);
}
....
}
En el mismo recuento, muchas bibliotecas (como jQuery) se desmoronarán horriblemente si extiendes object.prototype, por lo que si usas una de ellas hasOwnProperty es solo una pérdida de ciclos de CPU. –
@Martin Jespersen ¿Entonces usted vende el código con "ADVERTENCIA SÓLO UTILICE CON LOS MARCOS A, B Y C" impresos en ellos? Lo sentimos, pero usar 'hasOwnProperty' * es ** una buena práctica. –
pues no estoy cansado de una trama llena de código javascript que está tan lejos de ser optimizado que incluso cromo ahoga en él, de nuevo, creo que debería estar agradecido ya hago mi dinero limpiando el desorden que otros hacen: P –
Los objetos no tienen longitud, necesitará usar una matriz si así lo desea.
Si usted tiene que encontrar el número de propiedades en un objeto hay una sola manera:
var length =0;
for(var i in obj) length++;
Utilice hasOwnProperty, por favor. –
¿Por qué, cómo? ¿Dónde se aplica hasOwnProperty a esto? – Olical
Mejor solo * no * actualizar Object.prototype? ¿Quién hace eso? ¡Este es realmente un gran ejemplo! –
Si está utilizando Underscore.js, puede utilizar _.size()
:
_.size({one : 1, two : 2, three : 3});
=> 3
Todavía tengo que ver la fuente, pero espero que 'size()' tenga 'hasOwnProperty' en cuenta. – RaphaelDDL
Esto está apoyado en Node.js y ambientes nuevos.
var obj = {a: "a", b: "b"};
Object.keys(obj).length // 2
No es compatible con IE8, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys#Browser_compatibility –
Aquí es función general de @Junaid Qadir Shekhanzai para "encontrar la longitud de un objeto" (que, como se nos dice, correctamente debería llamarse "contando las propiedades de un objeto"). Combina soluciones de @Ivo Wetzel y @ Martin Jespersen:
function countProperties(myObj){
var length = 0;
if(typeof myObj != 'object'){
return false;
}
for(var i in myObj) {
length++;
}
return length;
}
- 1. JavaScript - Ventajas del objeto literal
- 2. ¿Literal del objeto dinámico en javascript?
- 3. JavaScript Método literal del objeto: llamada recursiva
- 4. Javascript objeto literal
- 5. JavaScript: undefined! == undefined?
- 6. Url Codificar Javascript objeto literal
- 7. JavaScript objeto literal confusión notación
- 8. javascript objeto patrón literal con varias instancias
- 9. Referenciando una matriz literal de objeto javascript
- 10. literal de objeto Javascript: inicialización de valor?
- 11. Función anidada dentro del Objeto literal
- 12. diferencia de objeto "Cadena", y literal de cadena en JavaScript
- 13. JQuery JavaScript Design: ¿Función autoejecutable u objeto literal?
- 14. Acceso JavaScript Object Valor literal en el mismo objeto
- 15. JavaScript y expresiones regulares: sintaxis literal vs. RegExp objeto
- 16. determinar la longitud de una cadena literal
- 17. ¿Qué es "undefined x 1" en JavaScript?
- 18. javascript/fecha JSON literal
- 19. Comprobando la longitud del objeto de diccionario
- 20. ¿Cómo agregar una variable privada a este fragmento literal del objeto Javascript?
- 21. Javascript: referencia literal del objeto en la función de la propia clave en lugar de 'esto'
- 22. longitud de objeto negativo posible en JavaScript o underscore.js? ¿sentido?
- 23. JavaScript: Acceso propia propiedad de objeto en el interior literal de matriz
- 24. Javascript literal vs función oop
- 25. Javascript/jQuery - val() Longitud' es nulo o no un objeto
- 26. ¿Cómo determinar si un objeto es un objeto literal en Javascript?
- 27. variable de referencia en el objeto literal?
- 28. prueba de Javascript (objeto && objeto! == "nulo" && objeto! == "indefinido")
- 29. Recuperando el objeto JSON Literal de HttpServletRequest
- 30. Cómo ordenar un objeto JS Literal?
posible duplicado de [Longitud de Javascript asociativa Array] (http://stackoverflow.com/questions/5223/length-of-javascript-associative-array) – ripper234