Длина литерала объекта JavaScript === undefined? - PullRequest
38 голосов
/ 14 января 2011

Я работаю над этой функцией анимации , но у меня проблема.Я не могу выполнить то, что должно быть легкой задачей, я не могу получить длину объекта.Если вы проверите этот jsFiddle, вы увидите, что я запускаю alert(properties.length); и он возвращает undefined.Кто-нибудь может понять, почему это может быть?

Ответы [ 5 ]

42 голосов
/ 06 марта 2012

Это поддерживается в node.js и более новых средах.

var obj = {a: "a", b: "b"};
Object.keys(obj).length // 2
42 голосов
/ 14 января 2011

JavaScript-объект просто делает не , имеет свойство length, только Arrays делает. Если вы хотите узнать количество свойств, определенных для объекта, вы должны выполнить итерации по ним и сосчитать их.

Кроме того, ваш цикл for in подвержен ошибкам из-за расширения Object.prototype, поскольку он будет проходить по всей цепочке прототипов и перечислять все свойства, которые находятся в цепочке .

Пример

// 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);
    }
    ....
 }
11 голосов
/ 06 марта 2012

Если вы используете Underscore.js , вы можете использовать _.size():

_.size({one : 1, two : 2, three : 3});
=> 3
0 голосов
/ 01 ноября 2017

Вот общая функция @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;
}
0 голосов
/ 14 января 2011

Объекты не имеют длины, вам нужно использовать массив, если вы этого хотите.

Если вам нужно найти количество свойств в объекте, есть только один способ:

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