2011-01-14 66 views
33

我正在研究这个animation function,但我有一个问题。我似乎无法执行应该是一件容易的事情,我无法得到一个对象的长度。如果你看看那个jsFiddle,你可以看到我正在运行alert(properties.length);,它返回undefined。任何人都可以看到为什么这可能是?JavaScript对象文字长度=== undefined?

+2

可能重复的[使用Javascript关联数组长度](http://stackoverflow.com/questions/5223/length-of-javascript-associative-array ) – ripper234 2012-01-31 10:15:26

回答

38

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); 
    } 
    .... 
} 
0

对象没有长度,如果需要的话,您需要使用数组。

如果你必须要找到一个对象的属性的数量,只有一个办法:

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

请使用hasOwnProperty。 – 2011-01-14 11:31:37

+1

为什么,怎么样? hasOwnProperty适用于此? – Olical 2011-01-14 11:38:55

+0

更好的只是*不*更新Object.prototype?谁做的?这实际上是一个很好的例子! – 2012-03-06 17:56:09

11

如果您正在使用Underscore.js,您可以使用_.size()

_.size({one : 1, two : 2, three : 3}); 
=> 3 
39

这Node.js和受新环境的支持。

var obj = {a: "a", b: "b"}; 
Object.keys(obj).length // 2 
0

这里的@Junaid卡迪尔Shekhanzai对“发现一个物体的长度”(这是我们被告知,应该适当地称为“计数的对象的性质”)一般功能。它结合@Ivo韦策尔和@马丁耶斯佩森解决方案:

function countProperties(myObj){ 
    var length = 0; 
    if(typeof myObj != 'object'){ 
     return false; 
    } 
    for(var i in myObj) { 
    length++; 
    } 
    return length; 
}