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

标签 javascript arrays garbage-collection

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

垃圾收集的通常引用:

Since Javascript is garbage collected, you don't need to delete objects themselves - they will be removed when there is no way to refer to them anymore.

这是否意味着当我删除数组中的元素时,由于可以随时引用该数组 - 垃圾收集器不会释放已删除的元素?或者这是否意味着因为无法引用该对象,它将释放内存? - 即使是这样,我的数组是否会被“未定义”条目填满,这些条目可能会占用至少 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'?

最佳答案

当您删除数组属性时,其值将变得无法访问*,因此一旦您删除它们,垃圾收集器就可以释放它们。

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

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

<小时/>

... - the Garbage collector wont free up the deleted element? or does it mean because the object can't be referred to, it will free up memory?

垃圾收集器从来没有义务释放任何内存,但可以重用先前由已删除数组属性的值使用的任何内存,而该属性未被任何属性或实时局部变量引用。

关于javascript - 已删除数组元素的垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23610051/

相关文章:

java - Java 垃圾收集器会停止我从 JNI 调用创建的 POSIX 线程吗?

javascript - Sinch - 无法建立从 Web (javascript) 到移动应用程序 (android/iOS) 的调用

javascript - 将 Deferred 添加到非异步函数

ios - 获取错误无法将类型 '(String,_) -> String' 的值转换为预期的参数类型 '(_, String) -> _'

php - 使用多个键重新排列数组

.net - 是否有必要像在 VB6 中一样释放 .Net 中的内存?

内联代码的 Javascript 垃圾收集

javascript - 在 Canvas 中创建随机形状

javascript - 使用 jquery hide() 时,Firefox 不会隐藏 div

c - 用随机字母填充二维数组-C编程