0

这个简单的代码将 100 万个字符串(100 个字符长度)存储在一个数组中。

function makestring(len) {
    var s = '';
    while (len--) s = s+'1';
    return s;
}

var s = '';
var arr = [];
for (var i=0; i<1000000; i++) {
    s = makestring(100);
    arr.push(s);
    if (i%1000 == 0) console.log(i+' - '+s);
}

当我运行它时,我得到这个错误:

(...)
408000 - 1111111111111111111 (...)
409000 - 1111111111111111111 (...)
FATAL ERROR: JS Allocation failed - process out of memory

奇怪的是 100 万 * 100 只是 100 兆字节。

但是,如果我将s = makestring(100);循环移到外部...

var s = makestring(100);
var arr = [];
for (var i=0; i<1000000; i++) {
    arr.push(s);
    if (i%1000 == 0) {
        console.log(i+' - '+s);
    }
}

这执行没有错误!

为什么?如何在节点中存储 100 万个对象?

4

2 回答 2

2

在将字符串生成移出循环的那一刻,您基本上只需创建一个字符串并将其推入数组中一百万次。

然而,在数组内部,只使用了指向原始字符串的指针,这比将字符串保存一百万次要少得多。

于 2013-01-28T07:45:40.210 回答
0

您的第一个示例构建1000000字符串。

在您的第二个示例中,您使用相同的字符串对象并将其添加到您的数组1000000时间中。(它不是复制字符串;数组的每个条目都指向同一个对象)

V8 做了很多事情来优化字符串的使用。例如,字符串连接(在大多数情况下)比您想象的要便宜。与其构建一个全新的字符串,它通常会选择在幕后以链表方式连接它们。

于 2013-01-28T07:46:41.957 回答