【发布时间】:2011-06-09 02:21:00
【问题描述】:
我正在处理这个animation function,但我有一个问题。我似乎无法完成本应轻松的任务,我无法获得对象的长度。如果您查看 jsFiddle,您可以看到我正在运行 alert(properties.length);,它正在返回 undefined。谁能明白为什么会这样?
【问题讨论】:
标签: javascript object properties object-literal
我正在处理这个animation function,但我有一个问题。我似乎无法完成本应轻松的任务,我无法获得对象的长度。如果您查看 jsFiddle,您可以看到我正在运行 alert(properties.length);,它正在返回 undefined。谁能明白为什么会这样?
【问题讨论】:
标签: javascript object properties object-literal
这在 node.js 和更新的环境中受支持。
var obj = {a: "a", b: "b"};
Object.keys(obj).length // 2
JavaScript 对象只是没有有length 属性,只有Arrays 有。如果您想知道在对象上定义的属性的数量,您必须遍历它们并计算它们。
此外,您的 for in 循环由于 Object.prototype 的扩展而容易出现错误,因为 in 将遍历完整的 原型链 并枚举 所有 上的属性链条。
示例
// 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);
}
....
}
【讨论】:
hasOwnProperty* 是一个好习惯。
p 传递到动画包装器中,就像i 和element 因为for in loop 将覆盖p。
如果你使用Underscore.js,你可以使用_.size():
_.size({one : 1, two : 2, three : 3});
=> 3
【讨论】:
size() 考虑到hasOwnProperty。
对象没有长度,如果需要,您需要使用数组。
如果您必须找到对象中的属性数量,那么只有一种方法:
var length =0;
for(var i in obj) length++;
【讨论】:
这是@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;
}
【讨论】: