如果类A有一个对象并将其传递给类B,那么由于类B引用了类A中的一个对象,是否将阻止类A进行垃圾回收?
答案 0 :(得分:0)
tldr
对象A将被垃圾回收。
为什么?
好吧,只要有对该对象的引用,Javascript中的每个对象都只能存在。由于在某个时候没有引用对象A,因此将其删除。但是共享对象(称为对象C)从未由对象A所“拥有”,对象A仅具有对对象C的引用。由于B仍具有对C的引用,因此不会删除C。
非引用类型呢?
虽然引用类型从不拥有而是作为引用存在,但原始类型由其父项拥有。
a = { x: "lorem ipsum" };
b = { y: a.x };
这意味着在上面的示例中,字符串“ lorem ipsum”在内存中保存了两次。如果删除了对象a,则字符串也将删除。这不会影响b,因为该字符串是按值复制的,这意味着它是第二次写入内存。
运行时如何知道引用了哪个对象?
每次GC启动时,它都会开始标记顶级范围内的引用可以访问的所有对象。在此过程中未标记的所有内容都将被删除(以某种方式,取决于运行中的GC的类型)。