JavaScript对象文字长度=== undefined?

Oli*_*cal 38 javascript properties object object-literal

我正在研究这个动画功能,但我遇到了问题.我似乎无法执行应该是一项简单的任务,我无法获得一个对象的长度.如果你看看jsFiddle你可以看到我正在运行alert(properties.length);它正在返回undefined.任何人都可以看到为什么这可能是?

Jam*_*son 43

node.js和更新的环境支持此功能.

var obj = {a: "a", b: "b"};
Object.keys(obj).length // 2
Run Code Online (Sandbox Code Playgroud)


Ivo*_*zel 42

JavaScript对象根本就不能有一个length属性,只有Arrays做.如果您想知道在对象上定义的属性数,则必须迭代它们并对它们进行计数.

此外,由于in将遍历整个原型链并枚举链中的所有属性,因此您的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'
}
Run Code Online (Sandbox Code Playgroud)

您必须在对象上使用hasOwnProperty方法才能过滤掉那些不需要的属性.

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

许多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);
    }
    ....
 }
Run Code Online (Sandbox Code Playgroud)

  • @Martin然后再也不再使用jQuery,它充满了对hasOwnProperty的调用.你正在做的是过早优化,没有别的. (3认同)

Cas*_*sey 11

如果您使用的是Underscore.js,则可以使用_.size():

_.size({one : 1, two : 2, three : 3});
=> 3
Run Code Online (Sandbox Code Playgroud)