Javascript 持有对对象属性的引用是否会阻止对象被垃圾收集?
假设我有一个对象:Javascript 持有对对象属性的引用是否会阻止对象被垃圾收集?,javascript,memory,memory-management,memory-leaks,garbage-collection,Javascript,Memory,Memory Management,Memory Leaks,Garbage Collection,假设我有一个对象: var o1 = { someKey: 'value' }; 以及引用第一个对象的另一个对象: var o2 = { o1Ref: o1 }; var o3 = { o1propRef: o1.someKey }; 以及引用第一个对象上的属性的第三个对象: var o2 = { o1Ref: o1 }; var o3 = { o1propRef: o1.someKey }; 然后,假设o2是垃圾收集的。对o3上的o1.some
var o1 = {
someKey: 'value'
};
以及引用第一个对象的另一个对象:
var o2 = {
o1Ref: o1
};
var o3 = {
o1propRef: o1.someKey
};
以及引用第一个对象上的属性的第三个对象:
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
可以释放出来
此外,我也意识到这可能因实现而异。如果是这样的话,一般来说,什么是最好的思考方式
对o3
上的o1.someKey
的引用是否阻止收集o1
没有,因为没有(参考资料)。创建对象时,您有一个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
根本没有建立任何类型的引用关系。谢谢你,t.J.-这就是我所怀疑的。我一直想删除我对“reference”一词的使用,因为我知道JS是按值传递的,但我后来想,也许是过时了,JS实现采用了“reference counting”?另外,我刚刚访问了你的个人资料(高得离谱,哇),注意到了这个答案:。我会读的@迪马迪玛:没错,JavaScript中的所有内容都是通过值传递或赋值的。没有按引用传递或按引用分配。有一种称为对象引用的值,它引用对象。但它仍然是一种价值。这就像索引到对象所在的大查找表中一样。实现是否使用引用计数或其他技术并不重要,因为您只是获取o1.someKey的值,而不是对它的任何引用。