遍历 map 时 JavaScript 堆内存不足?

标签 javascript node.js dictionary

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]

有人能解释一下原因吗? ma​​p 得到实例化就好了。只有当我遍历 ma​​p 键并将它们添加到我的 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/

相关文章:

javascript - document.getElementById() 不工作 - 可能是因为页面尚未加载?

javascript - MUI + React Hook 表单 : Fill out TextField value but then can't modify the value

javascript - 从 html 下拉菜单中选择后,重定向页面并通过 url 传递选择值?

jquery - 在重新加载链接样式表时强制重新计算 $(...).css ("background-image")

Python:要比较两个列表以进行格式匹配并制作成字典

javascript - jQuery 的 html() 会删除附加到被替换元素的所有数据吗?

json - 如何更新 dynamoDB 中 map 数据类型的项目

javascript - 理解 javascript 对象与 map

ios - 使用 PNG 作为自定义 map iOS

node.js - 错误 : listen EACCES on Openshift app