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
问题是你的键是字符串,而不是数字.在添加之前,您需要调用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函数().
| 归档时间: |
|
| 查看次数: |
520 次 |
| 最近记录: |