40

このアニメーション機能に取り組んでいますが、問題があります。簡単な作業を実行できないようです。オブジェクトの長さを取得できません。そのjsFiddleをチェックアウトすると、私が実行alert(properties.length);していて、戻ってきていることがわかりますundefined。なぜこれが起こるのか誰かがわかりますか?

4

5 に答える 5

46

これは、node.js 以降の環境でサポートされています。

var obj = {a: "a", b: "b"};
Object.keys(obj).length // 2
于 2012-03-06T17:58:27.260 に答える
43

JavaScript オブジェクトには単にプロパティがなく、あるだけです。オブジェクトで定義されているプロパティの数を知りたい場合は、それらを反復処理してカウントする必要があります。lengthArrays

また、ループは完全なプロトタイプ チェーンをトラバースし、チェーンにあるすべてのプロパティを列挙するため、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);
    }
    ....
 }
于 2011-01-14T11:31:25.190 に答える
11

Underscore.jsを使用している場合は、次を使用できます_.size()

_.size({one : 1, two : 2, three : 3});
=> 3
于 2012-03-06T17:44:23.897 に答える
0

オブジェクトには長さがありません。必要な場合は配列を使用する必要があります。

オブジェクト内のプロパティの数を見つける必要がある場合、方法は 1 つだけです。

var length =0;
for(var i in obj) length++;
于 2011-01-14T11:30:51.257 に答える