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。在我看来,第二个警报应该产生相同的结果?该 temp 几乎应该是 val 的精确副本?

它的jsfiddle:

http://jsfiddle.net/vMMd2/

哦 - 如果你想让你的浏览器窗口崩溃(它让我的谷歌浏览器窗口崩溃了),只需在最后添加以下内容:

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 运行了上面的内容,所以没有显示空值。

如果我做了 JSON.stringfy() 那么你会看到:

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