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)
以上代码在使用 node 运行时返回以下错误 -
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory 1: 0x100037ddb node::Abort() [/usr/local/bin/node]
有人能解释一下原因吗? map 得到实例化就好了。只有当我遍历 map 键并将它们添加到我的 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)
这背后的逻辑是什么。为什么循环映射中的键如此糟糕?
Node version v10.7.0
最佳答案
问题是您的键是字符串,而不是数字。添加前需要调用 parseInt() 或 Number() 进行转换:
for (let i in map) {
for (let j in map) {
ans += Number(i) + Number(j)
}
}
循环仍然会花费很长时间(您正在迭代 10**10 次),但是您不会积累一个巨大的字符串来消耗内存。
更新:屈服于使用 Number() 而不是 parseInt() 的首要地位。
关于遍历 map 时 JavaScript 堆内存不足?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53177993/