2

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

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 是否会以某种方式分散在内存中,从而阻止此方法有效扩展?
4

2 回答 2

2

javascript 原型性质使一切都成为对象。所有对象都是映射,字面意思是哈希映射。这意味着,正如您所说,当您将对象从一个数组“拉”到另一个数组时,您只是在复制它们的引用。

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

1 - 这是对内存最友好的方式吗?

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

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

如果没有任何其他引用指向它们。是的。循环内存泄漏在旧浏览器中很常见,但对于新浏览器,可以肯定地说是。

3 - newArray 是否会分散在内存中以防止此方法有效扩展?

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

于 2012-07-06T20:01:55.373 回答
1

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

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.是的,JavaScript 在这些方面做得很好,您唯一需要注意的是 IE 闭包,这不会是由您的代码引起的。我仍然发现在极少数情况下关闭在 IE9 中很常见,但这些通常是由链接到 DOM 引起的,这在这种情况下是无关紧要的。

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

于 2012-07-06T20:10:04.573 回答