Я работаю над этой функцией анимации, но у меня возникла проблема. Кажется, я не могу выполнить то, что должно быть легкой задачей, я не могу получить длину объекта. Если вы посмотрите на этот jsFiddle, вы увидите, что я запускаю alert(properties.length);
, а он возвращает undefined
. Кто-нибудь может понять, почему это может быть?
Длина литерала объекта JavaScript === не определена?
Ответы (5)
У объекта JavaScript просто нет свойства length
, есть только Arrays
. Если вы хотите узнать количество свойств, определенных для объекта, вам нужно выполнить итерацию по ним и подсчитать их.
Кроме того, ваш цикл for in
подвержен ошибкам из-за расширения Object.prototype
, поскольку in будет проходить всю цепочку прототипов и перечислять все свойства, которые есть в цепочке.
Пример
// Poisoning Object.prototype
Object.prototype.bar = 1;
var foo = {moo: 2};
for(var i in foo) {
console.log(i); // logs both 'moo' AND 'bar'
}
Вы должны использовать метод hasOwnProperty для объекта, чтобы отфильтруйте эти нежелательные свойства.
// still the foo from above
for(var i in foo) {
if (foo.hasOwnProperty(i)) {
console.log(i); // only logs 'moo'
}
}
Многие фреймворки JavaScript расширяют прототип, неиспользование hasOwnProperty
часто приводит к ужасным ошибкам.
Обновить
Что касается фактической проблемы, что ваш код не является анимацией, оба свойства.
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);
}
....
}
hasOwnProperty
является* хорошей практикой.
- person Ivo Wetzel; 14.01.2011
properties
объект.
- person Ivo Wetzel; 14.01.2011
p
в оболочку анимации, точно так же, как i
и element
, поскольку в противном случае for in loop
переопределит p
.
- person Ivo Wetzel; 14.01.2011
Это поддерживается в node.js и более новых средах.
var obj = {a: "a", b: "b"};
Object.keys(obj).length // 2
Если вы используете Underscore.js, вы можете использовать _.size()
:
_.size({one : 1, two : 2, three : 3});
=> 3
size()
учитывает hasOwnProperty
.
- person RaphaelDDL; 10.04.2014
Объекты не имеют длины, вам нужно будет использовать массив, если вы этого хотите.
Если вам нужно найти количество свойств в объекте, есть только один способ:
var length =0;
for(var i in obj) length++;
Вот общая функция @Junaid Qadir Shekhanzai для «нахождения длины объекта» (которую, как нам сказали, следует правильно называть «подсчетом свойств объекта»). Он объединяет решения @Ivo Wetzel и @Martin Jespersen:
function countProperties(myObj){
var length = 0;
if(typeof myObj != 'object'){
return false;
}
for(var i in myObj) {
length++;
}
return length;
}