此时,我们可以使用以下语句来查看a所引用的对象的引用计数:var a = {
name: 'job',
age: 24
};
结果如下:console.log(Object.getOwnPropertyNames(a.__proto__))
console.log(Object.getOwnPropertyNames(a))
console.log(Object.getOwnPropertyNames(Object.prototype))
我们发现a引用的对象的引用计数为1,因为它被变量a引用,但是该对象的__proto__和Object.prototype的引用计数都为0,因为它们没有被任何对象引用。 现在,我们在控制台中再次定义一个变量b,并将a所引用的对象赋值给变量b:["constructor", "__defineGetter__", "__defineSetter__", ...]
["name", "age"]
["constructor", "__defineGetter__", ...]
这时,我们再次查看a、b以及它们引用的对象的引用计数:var b = a;
结果如下:console.log(Object.getOwnPropertyNames(a.__proto__))
console.log(Object.getOwnPropertyNames(a))
console.log(Object.getOwnPropertyNames(b))
console.log(Object.getOwnPropertyNames(Object.prototype))
我们发现a和b引用的对象的引用计数都变成了2,因为它们都引用了同一个对象。此时,如果我们将变量b的值设置为null,则该对象的引用计数会减1:["constructor", "__defineGetter__", "__defineSetter__", ...]
["name", "age"]
["name", "age"]
["constructor", "__defineGetter__", ...]
这时,我们再次查看a和它引用的对象的引用计数:b = null;
结果如下:console.log(Object.getOwnPropertyNames(a.__proto__))
console.log(Object.getOwnPropertyNames(a))
console.log(Object.getOwnPropertyNames(Object.prototype))
我们发现b变量与它之前所引用的对象的引用关系被解除,因此该对象的引用计数减至1,而a变量与该对象的引用关系依旧存在,因此该对象继续被保留在内存中。 总的来说,引用计数器是JavaScript进行垃圾回收的重要机制之一。在使用JavaScript进行开发时,了解引用计数器的工作原理是非常有必要的。["constructor", "__defineGetter__", "__defineSetter__", ...]
["name", "age"]
["constructor", "__defineGetter__", ...]