此時(shí),我們可以使用以下語句來查看a所引用的對象的引用計(jì)數(shù):var a = {
name: 'job',
age: 24
};
結(jié)果如下:console.log(Object.getOwnPropertyNames(a.__proto__))
console.log(Object.getOwnPropertyNames(a))
console.log(Object.getOwnPropertyNames(Object.prototype))
我們發(fā)現(xiàn)a引用的對象的引用計(jì)數(shù)為1,因?yàn)樗蛔兞縜引用,但是該對象的__proto__和Object.prototype的引用計(jì)數(shù)都為0,因?yàn)樗鼈儧]有被任何對象引用。 現(xiàn)在,我們在控制臺中再次定義一個(gè)變量b,并將a所引用的對象賦值給變量b:["constructor", "__defineGetter__", "__defineSetter__", ...]
["name", "age"]
["constructor", "__defineGetter__", ...]
這時(shí),我們再次查看a、b以及它們引用的對象的引用計(jì)數(shù):var b = a;
結(jié)果如下:console.log(Object.getOwnPropertyNames(a.__proto__))
console.log(Object.getOwnPropertyNames(a))
console.log(Object.getOwnPropertyNames(b))
console.log(Object.getOwnPropertyNames(Object.prototype))
我們發(fā)現(xiàn)a和b引用的對象的引用計(jì)數(shù)都變成了2,因?yàn)樗鼈兌家昧送粋€(gè)對象。此時(shí),如果我們將變量b的值設(shè)置為null,則該對象的引用計(jì)數(shù)會減1:["constructor", "__defineGetter__", "__defineSetter__", ...]
["name", "age"]
["name", "age"]
["constructor", "__defineGetter__", ...]
這時(shí),我們再次查看a和它引用的對象的引用計(jì)數(shù):b = null;
結(jié)果如下:console.log(Object.getOwnPropertyNames(a.__proto__))
console.log(Object.getOwnPropertyNames(a))
console.log(Object.getOwnPropertyNames(Object.prototype))
我們發(fā)現(xiàn)b變量與它之前所引用的對象的引用關(guān)系被解除,因此該對象的引用計(jì)數(shù)減至1,而a變量與該對象的引用關(guān)系依舊存在,因此該對象繼續(xù)被保留在內(nèi)存中。 總的來說,引用計(jì)數(shù)器是JavaScript進(jìn)行垃圾回收的重要機(jī)制之一。在使用JavaScript進(jìn)行開發(fā)時(shí),了解引用計(jì)數(shù)器的工作原理是非常有必要的。["constructor", "__defineGetter__", "__defineSetter__", ...]
["name", "age"]
["constructor", "__defineGetter__", ...]