2

私のJavaScriptで、空の配列を作成し、それを連想配列としてループし、内容を出力すると、ArrayObjectクラス自体から関数のように見えるものが返されることに気付きました。これが私のコードです:

var test = new Array();
for(var i in test){
    document.write(i + " " + test[i] + "<br>");
}
alert(test.length); // this returns 0

上記のコードは次のように出力します(長いので出力の一部を省略しています)

$family function (){return u; }
$constructor function Array() { [native code] }
pop function pop() { [native code] }
push function push() { [native code] }
reverse function reverse() { [native code] }
shift function shift() { [native code] }
sort function sort() { [native code] }
splice function splice() { [native code] }
unshift function unshift() { [native code] }
concat function concat() { [native code] }
join function join() { [native code] }
slice function slice() { [native code] }
indexOf function indexOf() { [native code] }
etc...

forループを使用して配列をループすると、次のようになります。

for(var i = 0; i < test.length; i++)

ブラウザは何も出力しません(これが発生するはずです)

逆の方法でループしたときに、空の配列から多数の関数を取得する理由を誰かが説明できますか?念のため、私はmootoolsv1.3を使用しています。前もって感謝します。

4

2 に答える 2

6

拡張されたものをすべて取り除きますArray.prototypeArrayまたはのようなデフォルトタイプのプロトタイプを拡張することObjectは悪いことであり、そのような問題を引き起こします。

プロトタイプの拡張機能を維持しながら問題を回避する簡単な方法は、if(!test.hasOwnProperty(i)) continue;チェックを追加することです。(プロパティがオブジェクト自体にあり、プロトタイプチェーンのどこかにある場合だけではありませんobj.hasOwnProperty(key)true

それ以外に、for..in配列を反復処理するときにループを使用for(var i = 0; i < array.length; i++)しないでください。この場合は使用してください。

于 2011-04-30T22:32:42.750 に答える
0

パーティーに少し遅れましたが、これを行う方法を見つけようとしているときにこれを見つけました. これが私が思いついたものです。

function createArrayOfEmptyObjects(size) {
    return Array.apply(0, new Array(size).map(function(){return {};});
}

その名前が示すように、指定されたサイズまでの空のオブジェクトの配列を作成します。

于 2014-12-21T04:06:47.717 に答える