Sto lavorando su questo animation function ma ho un problema. Non riesco a eseguire quello che dovrebbe essere un compito facile, non riesco a ottenere la lunghezza di un oggetto. Se controlli che jsFiddle puoi vedere che sto correndo alert(properties.length);
e sta restituendo undefined
. Qualcuno può capire perché questo potrebbe essere?Lunghezza letterale dell'oggetto JavaScript === undefined?
risposta
oggetto JavaScript semplicemente fare non hanno una proprietà length
, solo Arrays
fanno. Se si desidera conoscere il numero di proprietà definite su un oggetto, è necessario eseguirne l'iterazione e contarle.
Inoltre, il ciclo for in
è incline a bug a causa del prolungamento Object.prototype
dal momento che in attraverserà la completa prototipo catena ed enumerare tutte le proprietà che sono sulla catena.
Esempio
// Poisoning Object.prototype
Object.prototype.bar = 1;
var foo = {moo: 2};
for(var i in foo) {
console.log(i); // logs both 'moo' AND 'bar'
}
Devi utilizzare il metodo hasOwnProperty sull'oggetto al fine di filtrare tali proprietà indesiderati.
// still the foo from above
for(var i in foo) {
if (foo.hasOwnProperty(i)) {
console.log(i); // only logs 'moo'
}
}
Molti framework JavaScript là fuori estendere il prototipo, non usando hasOwnProperty
spesso porta ad errori orribili.
Aggiornamento
Per quanto riguarda il problema reale che il codice non è l'animazione entrambe le proprietà.
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);
}
....
}
Sullo stesso numero un sacco di librerie là fuori (come jQuery) andranno in pezzi in modo orribile se si estrae object.prototype, quindi se si usa uno di loro hasOwnProperty è solo uno spreco di cicli cpu. –
@Martin Jespersen Quindi vendi il codice con "ATTENZIONE USARE SOLO CON I FRAMEWORKS A, B AND C" stampati su di essi? Siamo spiacenti, ma l'uso di 'hasOwnProperty' * è ** una buona pratica. –
No, sono solo stanco di un web pieno di codice javascript che è così lontano dall'ottimizzazione che anche il cromo soffoca su di esso, quindi di nuovo, credo dovrei essere grato da quando faccio i miei soldi ripulendo il casino che gli altri fanno: P –
Gli oggetti non hanno lunghezza, è necessario utilizzare un array se lo si desidera.
Se dovete trovare il numero di proprietà in un oggetto non v'è un solo modo:
var length =0;
for(var i in obj) length++;
Utilizzare hasOwnProperty, per favore. –
Perché, come? Dove si applica hasOwnProperty a questo? – Olical
Meglio solo * non * aggiornare Object.prototype? Chi lo fa? Questo è davvero un grande esempio! –
Se si utilizza Underscore.js, è possibile utilizzare _.size()
:
_.size({one : 1, two : 2, three : 3});
=> 3
Devo ancora vedere la fonte ma spero che 'size()' tenga conto di 'hasOwnProperty'. – RaphaelDDL
Questo è supportato in node.js e ambienti nuovi.
var obj = {a: "a", b: "b"};
Object.keys(obj).length // 2
Non supportato in IE8, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys#Browser_compatibility –
Ecco la funzione generale di @Junaid Qadir Shekhanzai per "trovare la lunghezza di un oggetto" (che, come c'è stato detto, dovrebbe essere propriamente chiamata "contare le proprietà di un oggetto"). Esso combina soluzioni di @ Ivo Wetzel e @ Martin Jespersen:
function countProperties(myObj){
var length = 0;
if(typeof myObj != 'object'){
return false;
}
for(var i in myObj) {
length++;
}
return length;
}
- 1. Come trovare la lunghezza della matrice letterale?
- 2. determinare la lunghezza di una stringa letterale
- 3. javascript/data JSON letterale
- 4. JavaScript - Vantaggi dell'oggetto letterale
- 5. Javascript import handle undefined
- 6. Assegnare in modo approfondito l'oggetto JavaScript letterale
- 7. URL Encode JavaScript Object letterale
- 8. Oggetto dinamico letterale in javascript?
- 9. JavaScript letterale oggetto notazione confusione
- 10. come gestire 'undefined' in javascript
- 11. Javascript: TypeError variable is undefined
- 12. Controllo Lunghezza multidimensionali Gli array JavaScript
- 13. codice Javascript, stringa non terminato letterale console
- 14. Modello di disegno JavaScript letterale o modulare
- 15. JavaScript: RegExp costruttore vs RegEx letterale
- 16. JavaScript ha una notazione letterale Mappa?
- 17. Esiste un set letterale in JavaScript?
- 18. Impossibile definire variabili in JavaScript letterale oggetto
- 19. Oggetto JavaScript letterale. object [i] .variable
- 20. Aggiunta del prototipo all'oggetto JavaScript Letterale
- 21. Imposta testo letterale ASP con Javascript
- 22. Che cos'è "undefined x 1" in JavaScript?
- 23. funzione JavaScript con il parametro 'undefined'
- 24. Perché "undefined" termina un ciclo in JavaScript?
- 25. google drive javascript api gapi.client.drive.files undefined
- 26. variabile denominata undefined in librerie javascript
- 27. variabili JavaScript undefined all'interno della funzione setTimeout
- 28. PHP letterale
- 29. String.charCodeAt undefined?
- 30. Trova lunghezza dell'array Javascript senza elementi eliminati
possibili duplicati di [Lunghezza di Javascript Associative Array] (http://stackoverflow.com/questions/5223/length-of-javascript-associative-array) – ripper234