内存最安全的方法从数组中提取子数组

时间:2012-07-06 19:57:02

标签: javascript arrays memory-management multidimensional-array garbage-collection

我正在遍历一个数组数组,拉出我需要的子数组并丢弃其余数组。

var newArray = [];
for (var i = 0; i < oldArray.length; i++) {
    if (oldArray[i][property] == value) {
        newArray.push(oldArray[i]);
    }
}
oldArray = newArray;
  1. 这是最便于记忆的方式吗?

  2. 垃圾收集是否会安全地处理我没有按下的子阵列 newArray?

  3. newArray是否会以一种可能阻止此方法有效扩展的方式分散在内存中?

2 个答案:

答案 0 :(得分:2)

javascript原型本质使一切成为一个对象。并且所有对象都是地图,字面意思是哈希地图。这意味着,当你正在“拉”时,就像你说的那样,从一个数组到另一个数组的对象,你只是复制它们的引用。

所以是的,如果删除引用(至少在现代浏览器中),我会说它不会给你带来太多的内存问题。但垃圾收集器的实现方式有所不同,具体取决于您使用的浏览器。

1 - 这是最适合记忆的方式吗?

如果删除引用,是的,这是一种内存友好的方式。您在c / c ++中没有任何free,并且在chrome上进行测试时我认为您可以调用window.gc()来调用垃圾收集器。我认为delete存在或存在,但我不知道它是如何工作的。

2-垃圾收集是否会安全地处理我没有附加到newArray的子​​数组?

如果没有任何其他引用指向它们。是。圆形内存泄漏在旧版浏览器中很常见,但对于新版浏览器,可以安全地说是。

3 - newArray是否会以一种可能阻止此方法有效扩展的方式分散在内存中?

是的,它将分散在内存中,因为javascript数组的工作方式类似于hashmaps或链接的hashmaps(如果我在这里弄错了,有人会纠正我)但垃圾收集器会处理它,因为它用于处理地图。再次,您只使用引用,对象将保留在同一位置,您只会在数组中存储引用。

答案 1 :(得分:1)

1.no ... fmsf大多是正确的,但是你可以做一些微优化来改善页面加载时间,以及检查条件的时间。如果在循环中保留oldArray.length,它将在每次迭代时在oldArray对象上查找长度,这可以在大循环中添加一些时间,同时实例化所有变量也可以节省一些时间,如果包含此方法被称为内在很多次 当有人下载​​你的脚本时,最好尽可能使用最短名称的所有变量从服务器到客户端进行最少的数据传输。

var nA = [],
    i = 0,
    t = oA.length,
    s;
for (; i < t; i++) {
    s = oA[i];
    if (s[p] == v) {
        nA.push(s[i]);
    }
}
oA = nA;

如果你想变得非常认真,你可以使用代码缩小器来重命名变量和删除空格。

2.yes,JavaScript对这些事情非常了解,唯一需要注意的是IE闭包,这不会是你的代码引起的。在奇怪的情况下,我仍然发现在极少数情况下闭包在IE9中很普遍,但这些通常是由链接到DOM引起的,这在这种情况下是无关紧要的。

3.不,这段代码唯一改变的是对对象的引用,而不是它们如何存储在内存中。