2011-01-14 65 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; 
}