wake-up-neo.com

JavaScript-Objektliterallänge === undefined?

Ich arbeite an dieser Animationsfunktion aber ich habe ein Problem. Ich kann scheinbar keine einfache Aufgabe erfüllen, ich kann die Länge eines Objekts nicht ermitteln. Wenn Sie jsFiddle auschecken, können Sie feststellen, dass ich alert(properties.length); ausführen und undefined zurückgibt. Kann jemand sehen, warum dies sein könnte?

37
Olical

JavaScript-Objekte haben einfach not eine length -Eigenschaft, nur Arrays. Wenn Sie wissen möchten, wie viele Eigenschaften für ein Objekt definiert sind, müssen Sie sie durchlaufen und zählen.

Außerdem ist Ihre for in-Schleife aufgrund der Erweiterung von Object.prototype für Fehler anfällig, da in die vollständige prototype-Kette durchläuft und all die Eigenschaften aufführt, die sich in der Kette befinden.

Beispiel

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

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

Sie müssen die Methode hasOwnProperty für das Objekt verwenden, um diese unerwünschten Eigenschaften herauszufiltern.

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

Viele JavaScript-Frameworks erweitern den Prototyp. Die Verwendung von hasOwnProperty führt oft zu schrecklichen Fehlern.

Update

In Bezug auf das tatsächliche Problem, dass Ihr Code nicht beide Eigenschaften der Animation ist.

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

Dies wird in node.js und neueren Umgebungen unterstützt.

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

Wenn Sie Underscore.js verwenden, können Sie _.size() verwenden:

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

Objekte haben keine Länge, Sie müssen ein Array verwenden, wenn Sie dies wünschen. 

Wenn Sie die Anzahl der Eigenschaften in einem Objekt ermitteln müssen, gibt es nur einen Weg:

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

Hier ist die allgemeine Funktion von @Junaid Qadir Shekhanzai zum "Ermitteln der Länge eines Objekts" (die, wie man uns sagt, eigentlich als "Zählen der Eigenschaften eines Objekts" bezeichnet wird). Es kombiniert Lösungen von @Ivo Wetzel und @Martin Jespersen:

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