JavaScript在映射上循环时内存不足? const map={} 对于(设i=0;i
在中为..使用JavaScript在映射上循环时内存不足? const map={} 对于(设i=0;i,javascript,node.js,dictionary,Javascript,Node.js,Dictionary,在中为..使用时,您正在迭代所有可枚举属性,包括原型链上的继承属性(对于对象,) 您需要使用hasOwnProperty保护您的循环不受继承的道具的影响,因为问题是您的键是字符串,而不是数字。您需要在添加之前调用parseInt()或Number()转换它们: let ans = 0 for (let i=0;i<10**5;i++) { for (let j=0;j<10**5;j++) { ans += i+j } } console.log(
时,您正在迭代所有可枚举属性,包括原型链上的继承属性(对于对象,)
您需要使用hasOwnProperty
保护您的循环不受继承的道具的影响,因为问题是您的键是字符串,而不是数字。您需要在添加之前调用parseInt()或Number()转换它们:
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)
循环仍然需要很长的时间(您正在迭代10**10次),但是您不会积累一个巨大的字符串来增加内存使用
更新:屈服于使用Number()而不是parseInt()的首要地位。在接受的答案中提到的原因是我添加了字符串。但是,从字符串转换为int是一项代价高昂的操作,特别是在循环处理如此大量的数字时,这将花费永远的时间
因此,对于阅读此问题并必须使用map的其他人,可以使用Javascriptmap而不是我在上面的示例中使用的Object,因为map可以支持任何类型的键(不仅仅是字符串)。因此,这方面的代码将是-
for (let i in map) {
for (let j in map) {
ans += Number(i) + Number(j)
}
}
const map=new map()
对于(设i=0;i虽然这是真的,Object.prototype
大约有20个属性。与OP创建的属性数量相比,这是微不足道的。此外,所有这些属性都是不可枚举的,因此不是问题。问题是,这些属性是使用推断的toString()成为字符串的函数加起来就是导致内存泄漏的串接不,这不是问题所在。字符串串接是问题所在,是的,但同样地,Object.prototype
中没有任何属性。另外,属性名从来都不是函数。证明:var ans=0;for(vari in{1:true,2:true})ans+=i;console.log(ans);
那么您是说错误是由于OP创建了一个“太大”的字符串?FWIW,不需要praseInt
。使用Number(i)
或+i
。是的。字符串越来越大。是的,还有其他方法可以将字符串转换为数字。我不认为特定优化是问题的重点。“我不认为特定优化是问题的重点。”当然。我会尽可能使用最简单的解决方案。parseInt
只是没有必要。真正的优化将是移动I=parseInt
或外部循环中的任何内容。如果使用parseInt,请将其与基数parseInt(字符串,10)
:)一起使用我将在答案中添加该选项,但不确定为什么parseInt比Number()有意义地更好或更差。可能是另一个问题的主题。:-)在这种情况下为什么不简单地使用数组?
for (let i in map) {
for (let j in map) {
ans += Number(i) + Number(j)
}
}
const map = new Map()
for (let i=0;i<10**5;i++) {
map.set(i, true)
}
let ans = 0
for (const i of map.keys()) {
for (const j of map.keys()) {
ans += i + j
}
}
console.log(ans)