Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 持有对对象属性的引用是否会阻止对象被垃圾收集?_Javascript_Memory_Memory Management_Memory Leaks_Garbage Collection - Fatal编程技术网

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的值,而不是对它的任何引用。