已删除数组元素的垃圾收集

时间:2014-05-12 13:12:58

标签: javascript arrays garbage-collection

如果我有一个大型数组,我一直在使用该应用程序的生命周期,例如用户列表。是的,我喜欢使用数组而不是对象有很多原因而且不能使用splice(),因为我有索引引用。

垃圾收集的常用报价:

  

由于Javascript是垃圾回收,因此您无需删除   对象本身 - 当没有办法时它们将被删除   再说它们了。

这是否意味着当我删除数组中的元素时,因为可以随时引用该数组 - 垃圾收集器不会释放已删除的元素?或者是否意味着因为对象无法被引用,它会释放内存? - 即使它是,我的数组不会被“未定义”的条目填满,这些条目可能会占用至少1或2个字节的内存? - 有没有人知道每个未定义的条目使用了多少内存?

示例:

var userList = [];
var userNumber = 0;

userList[userNumber++] = {name:'john',score:200,friends:['abby','micky']};
userList[userNumber++] = {name:'jack',score:200,friends:['betty','billy']};
userList[userNumber++] = {name:'jimm',score:200,friends:['catty','ken']};

delete userList[1];
// will {name:'jack',score:200,friends[ n ]} size of memory be freed 
// or a little less to internally reference 'undefined'?

1 个答案:

答案 0 :(得分:0)

当你删除一个数组属性时,它的值变得无法访问 * ,因此只要你delete它们就可以被垃圾收集器释放。

a = [0, 1, 2]
alert(1 in a);  // true
delete a[1];
alert(1 in a);  // false

* - 假设无法从可到达对象或实时局部变量的属性访问数组元素。


  

... - 垃圾收集器不会释放已删除的元素?或者是否意味着因为无法引用该对象,它会释放内存吗?

垃圾收集器永远不必释放任何内存,但可以重用以前由删除的数组属性的值使用的任何内存,否则任何属性或实时局部变量都不会引用它。