假设我有一个对象:
var o1 = {
someKey: 'value'
};
和引用第一个对象的另一个对象:
var o2 = {
o1Ref: o1
};
还有引用第一个对象属性的第三个对象:
var o3 = {
o1propRef: o1.someKey
};
然后,假设 o2
被垃圾回收了。 o3
上对 o1.someKey
的引用是否会阻止收集 o1
?
然后,同样,假设 o1
更大,说:
var o1 = {
someKey: 'value',
someBigValue: Buffer(2000000)
};
是否可以收集未被引用的 o1
部分,或者将对象作为一个整体收集?看起来,对于 o1
的第二个版本,o3
只是坚持 o1.someKey
和 o1.someBigValue
可以被释放。
此外,我确实意识到这可能因实现而异。如果是这样,一般来说,最好的思考方式是什么?
最佳答案
Does the reference to
o1.someKey
ono3
prevento1
from being collected?
没有,因为没有(引用)。截至您创建对象时,您拥有o1.someKey
的值 的副本,而不是对o1 的引用。 someKey
属性。 (JavaScript 没有引用任何东西,只有对象;所以没有属性引用,只有对象引用。)
你可以看到你只是通过玩它来获得初始化的值:
var o1 = {
someKey: 'value'
};
var o3 = {
o1propRef: o1.someKey // (It's not a property reference, it's a copy of the value, but I left the name alone)
};
console.log(o3.o1propRef); // "value"
o1.someKey = "updated value";
console.log(o3.o1propRef); // "value"
console.log(o1.someKey); // "updated vale"
为了o3
防止o1
被垃圾回收,o3
必须引用o1
(或对它有引用的东西)。仅仅从 o1.someKey
获取一个值根本不会建立任何类型的引用关系。
关于javascript - 持有对对象属性的引用是否会阻止对象被垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21861563/