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ć?
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);
}
....
}
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
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
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++;
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;
}
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