web-dev-qa-db-fra.com

Longueur littérale de l'objet JavaScript === non défini?

Je travaille sur cette fonction d'animation mais j'ai un problème. Je n'arrive pas à effectuer ce qui devrait être une tâche facile, je ne peux pas obtenir la longueur d'un objet. Si vous vérifiez que jsFiddle vous voyez que je suis en train d’exécuter alert(properties.length); et qu’il renvoie undefined. Quelqu'un peut-il voir pourquoi cela pourrait être?

37
Olical

L'objet JavaScript n'a tout simplement que not une propriété length, seulement Arrays do. Si vous souhaitez connaître le nombre de propriétés définies sur un objet, vous devez les parcourir et les compter.

De plus, votre boucle for in est sujette aux bogues en raison de l'extension Object.prototype car in traversera la chaîne complète prototype et énumérera all les propriétés qui se trouvent sur la chaîne.

Exemple

// Poisoning Object.prototype
Object.prototype.bar = 1;

var foo = {moo: 2};
for(var i in foo) {
    console.log(i); // logs both 'moo' AND 'bar'
}

Vous devez utiliser la méthode hasOwnProperty sur l'objet afin de filtrer ces propriétés indésirables.

// still the foo from above
for(var i in foo) {
    if (foo.hasOwnProperty(i)) {
        console.log(i); // only logs 'moo'
    }
}

De nombreux frameworks JavaScript étendent le prototype, ne pas utiliser hasOwnProperty conduit souvent à des bugs horribles.

Mettre à jour

Concernant le problème actuel, votre code n'est pas une animation, mais les deux propriétés.

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);
    }
    ....
 }
40
Ivo Wetzel

Ceci est pris en charge dans node.js et les environnements plus récents.

var obj = {a: "a", b: "b"};
Object.keys(obj).length // 2
41
Jamund Ferguson

Si vous utilisez Underscore.js , vous pouvez utiliser _.size():

_.size({one : 1, two : 2, three : 3});
=> 3
11
Casey

Les objets n'ont pas de longueur, vous devrez utiliser un tableau si vous le souhaitez. 

Si vous devez trouver le nombre de propriétés dans un objet, il n'y a qu'un moyen:

var length =0;
for(var i in obj) length++;
0
Martin Jespersen

Voici la fonction générale de @Junaid Qadir Shekhanzai pour "trouver la longueur d'un objet" (ce qui, comme on le dit, devrait être appelé à juste titre "compter les propriétés d'un objet"). Il combine les solutions de @Ivo Wetzel et @Martin Jespersen:

function countProperties(myObj){
    var length = 0;
    if(typeof myObj != 'object'){
        return false;
    }
    for(var i in myObj) {
    length++;
    }
    return length;
}
0
Michael McGinnis