循环遍历地图时JavaScript堆内存不足?

Yas*_*wal 2 javascript dictionary node.js

const map = {}

for (let i=0;i<10**5;i++) {
    map[i] = true
}


let ans = 0

for (let i in map) {
    for (let j in map) {
        ans += i+j
    }
}


console.log(ans)
Run Code Online (Sandbox Code Playgroud)

使用节点运行时上面的代码返回以下错误 -

致命错误:堆限制附近的无效标记 - 压缩分配失败 - JavaScript堆内存不足1:0x100037ddb node :: Abort()[/ usr/local/bin/node]

有人可以解释原因吗?该地图被实例化就好了.只有当我遍历地图键并将它们添加到我的ans变量时,我才会遇到这个问题?

但是,以下类似的代码工作正常并打印ans -

let ans = 0

for (let i=0;i<10**5;i++) {
    for (let j=0;j<10**5;j++) {
        ans += i+j
    }
}

console.log(ans)
Run Code Online (Sandbox Code Playgroud)

这背后的逻辑是什么?为什么在地图中循环键如此糟糕?

节点版本v10.7.0

Jim*_* B. 6

问题是你的键是字符串,而不是数字.在添加之前,您需要调用parseInt()或Number()来转换它们:

for (let i in map) {
    for (let j in map) {
        ans += Number(i) + Number(j)
    }
}
Run Code Online (Sandbox Code Playgroud)

循环仍然需要很长时间(你正在迭代10**10次),但是你不会累积一个巨大的字符串来破坏内存使用量.

UPDATE:屈服于使用数量(的首要地位),而不是parseInt函数().