Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript在映射上循环时内存不足? const map={} 对于(设i=0;i_Javascript_Node.js_Dictionary - Fatal编程技术网

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)