我正在研究animation function,但我遇到了问题。我似乎无法执行应该是一项简单的任务,我无法获得一个对象的长度。如果您查看jsFiddle,您可以看到我正在运行alert(properties.length);
并且它正在返回undefined
。谁能明白为什么会这样呢?
答案 0 :(得分:42)
node.js和更新环境支持此功能。
var obj = {a: "a", b: "b"};
Object.keys(obj).length // 2
答案 1 :(得分:41)
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);
}
....
}
答案 2 :(得分:11)
如果您使用的是Underscore.js,则可以使用_.size()
:
_.size({one : 1, two : 2, three : 3});
=> 3
答案 3 :(得分:0)
对象没有长度,如果需要,您需要使用数组。
如果必须找到对象中的属性数,则只有一种方法:
var length =0;
for(var i in obj) length++;
答案 4 :(得分:0)
这是@Junaid Qadir Shekhanzai的一般功能,用于找到一个物体的长度&#34; (正如我们所说,应该适当地调用&#34;计算对象的属性&#34;)。它结合了@Ivo Wetzel和@Martin Jespersen的解决方案:
function countProperties(myObj){
var length = 0;
if(typeof myObj != 'object'){
return false;
}
for(var i in myObj) {
length++;
}
return length;
}