我正在处理这个动画函数,但是我遇到了一个问题。我似乎无法执行应该很容易的任务,即无法获取对象的长度。如果你查看那个jsFiddle,你会发现我在运行alert(properties.length);
,但它返回undefined
。有人能看出为什么吗?
我正在处理这个动画函数,但是我遇到了一个问题。我似乎无法执行应该很容易的任务,即无法获取对象的长度。如果你查看那个jsFiddle,你会发现我在运行alert(properties.length);
,但它返回undefined
。有人能看出为什么吗?
这在Node.js和更新的环境中受支持。
var obj = {a: "a", b: "b"};
Object.keys(obj).length // 2
JavaScript对象并没有length
属性,只有数组
才有。如果你想知道一个对象上定义的属性数量,你必须遍历它们并计数。
另外,你的for 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);
}
....
}
properties
对象中会出现奇怪的问题。 - Ivo Wetzelp
传递到动画包装器中,就像 i
和 element
一样,因为 for in
循环否则会覆盖 p
。 - Ivo Wetzel如果你在使用Underscore.js,你可以使用_.size()
:
_.size({one : 1, two : 2, three : 3});
=> 3
size()
能够考虑 hasOwnProperty
。 - RaphaelDDL对象没有长度,如果您需要长度,必须使用数组。
如果您需要查找对象中属性的数量,只有一种方法:
var length =0;
for(var i in obj) length++;
function countProperties(myObj){
var length = 0;
if(typeof myObj != 'object'){
return false;
}
for(var i in myObj) {
length++;
}
return length;
}