4
var keys = [7925181,"68113227"];
var vals = {"7925181":["68113227"],"68113227":["7925181"]};

var temp = [];
for (var i = 0; i < keys.length; i++) {
    temp[keys[i]] = vals[keys[i]];
}
//alert(JSON.stringify(vals).length);
alert(JSON.stringify(temp).length);

そのスクリプトを Chrome で実行すると、かなりの時間が経過すると、340666156 という出力が得られます。

私の質問は... どうやって?

コメントアウトされたアラートは 47 を出力します。2 番目のアラートでも同じ結果が得られると思いますか? その temp は、ほとんど val の正確なコピーである必要がありますか?

それのjsfiddle:

http://jsfiddle.net/vMMd2/

ああ、ブラウザ ウィンドウをクラッシュさせたい場合は (Google Chrome ウィンドウをクラッシュさせてしまいました)、末尾に次を追加するだけです。

temp.forEach(function(entry) {
    alert(temp);
});

何か案は?

4

2 に答える 2

11
var keys = [7925181,"68113227"];
var vals = {"7925181":["68113227"],"68113227":["7925181"]};

var temp = {}; //  <--- !!!
for (var i = 0; i < keys.length; i++) {
    temp[keys[i]] = vals[keys[i]];
}
//alert(JSON.stringify(vals).length);
alert(JSON.stringify(temp).length);

http://jsfiddle.net/zerkms/vMMd2/2/

スパース配列を作成しており、おそらく V8 はすべてのギャップをガベージ null未定義値で初期化します (それを確認してくれたnnnnnnに感謝します)。時間がかかります

于 2013-03-19T03:16:21.053 に答える
7

@zerkms、そうですね。しかし、なぜこれが起こっているのかを指摘したかったのです。

> var temp = [];
> temp[10] = 'test';
> temp 
[ , , , , , , , , , , 'test' ]

ご覧のとおり、9 つの未定義の値が作成されます。上記をnodejsで実行したため、null値は表示されません。

JSON.stringfy() を実行すると、次のように表示されます。

> JSON.stringify(temp)
'[null,null,null,null,null,null,null,null,null,null,"test"]'
于 2013-03-19T03:21:19.917 に答える