JavaScript object literal length = = = undefined?

Pracuję nad tą funkcją animacji ale mam problem. Nie mogę wykonać tego, co powinno być łatwym zadaniem, nie mogę uzyskać długości obiektu. Jeśli sprawdzisz ten jsFiddle, zobaczysz, że uruchamiam alert(properties.length); i zwraca undefined. Czy ktoś wie, dlaczego tak może być?

Author: Olical, 2011-01-14

5 answers

Obiekt JavaScript po prostu robi nie ma właściwość length, Tylko Arrays robi. Jeśli chcesz znać liczbę właściwości zdefiniowanych na obiekcie, musisz je iterować i policzyć.

Również twoja pętla for in jest podatna na błędy z powodu rozszerzenia Object.prototype, ponieważ in przemierzy kompletny prototypowy łańcuchi wyliczy wszystkie właściwości, które znajdują się w łańcuchu.

Przykład

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

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

Musisz użyć metoda hasOwnProperty na obiekcie w celu odfiltrowania tych niechcianych właściwości.

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

Wiele frameworków JavaScript rozszerza prototyp, nieużywanie hasOwnProperty często prowadzi do strasznych błędów.

Update

Dotyczący faktycznego problemu, że Twój kod nie jest animacją obu właściwości.

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
Author: Ivo Wetzel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-14 11:48:34

Jest to obsługiwane w node.js i nowsze środowiska.

var obj = {a: "a", b: "b"};
Object.keys(obj).length // 2
 40
Author: Jamund Ferguson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-06 17:58:27

Jeśli używasz podkreślenia.js, możesz użyć _.size():

_.size({one : 1, two : 2, three : 3});
=> 3
 11
Author: Casey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-06 17:44:23

Obiekty nie mają długości, musisz użyć tablicy, jeśli tego chcesz.

Jeśli musisz znaleźć liczbę właściwości w obiekcie, jest tylko jeden sposób:

var length =0;
for(var i in obj) length++;
 0
Author: Martin Jespersen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-14 11:30:51

Oto ogólna funkcja @ Junaid Qadir Shekhanzai ' a do "znajdowania długości obiektu "(która, jak nam powiedziano, powinna być właściwie nazywana "zliczaniem właściwości obiektu"). Łączy w sobie rozwiązania @Ivo Wetzel i @ Martin Jespersen:

function countProperties(myObj){
    var length = 0;
    if(typeof myObj != 'object'){
        return false;
    }
    for(var i in myObj) {
    length++;
    }
    return length;
}
 0
Author: Michael McGinnis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-31 21:49:00