JSON字符串化将47字节的json字符串转换为340mb?

时间:2013-03-19 03:13:57

标签: javascript json

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.在我看来,第二次警报应该产生相同的结果?那个温度应该是val的精确副本吗?

它的jsfiddle:

http://jsfiddle.net/vMMd2/

哦 - 如果你想破坏你的浏览器窗口(好吧它崩溃了我的谷歌浏览器窗口),只需添加以下内容:

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

有什么想法吗?

2 个答案:

答案 0 :(得分: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检查) 。这需要一些时间

答案 1 :(得分: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"]'