看到文章说垃圾回收机制有两种情况,一种是标记法,一种是引用计数法,看到引用计数法的一个例子,没怎么看明白,文章说:声明一个变量并将一个引用类型值赋给该变量时,这个值得引用次数就是 1。如果同一个值又被赋给另外一个变量,则该值的引用次数加 1。相反,如果包含对这个值的引用的变量又取得另外一个值,这个值得引用次数减 1。当这个值得引用次数为 0 时,则说明没有办法再访问到此值,因此就可以将其占用的内存空间回收。当垃圾收集器在下一个周期运行时,会释放引用次数为零的值所占用的内存空间。function countMethod(){
var object1 = new Object(); // 声明变量,计数器由 0 变为 1
object1.method1 = "This is object1"; // object1 计数器 -1,object1 读数变为0
}通过上例看出,正常情况下,当函数运行结束后,object1 object2的读数均为 0,在下一个垃圾收集周期时,会被回收并且释放其所占用的内存。那么:这里的话,这个值代表Object的一个实例,对这个实例的引用的变量是object1,如果object1又取得另外一个值,那么实例的引用次数减一,这里的话,object1.method1 = XXXX,这里object1又取得了另外一个值了么?这不是只是对实例对象的属性的修改么?object1不是还是引用的是Object的实例么?
问题有点多哈,在此先谢过了。
var object1 = new Object(); // 声明变量,计数器由 0 变为 1
object1.method1 = "This is object1"; // object1 计数器 -1,object1 读数变为0
}通过上例看出,正常情况下,当函数运行结束后,object1 object2的读数均为 0,在下一个垃圾收集周期时,会被回收并且释放其所占用的内存。那么:这里的话,这个值代表Object的一个实例,对这个实例的引用的变量是object1,如果object1又取得另外一个值,那么实例的引用次数减一,这里的话,object1.method1 = XXXX,这里object1又取得了另外一个值了么?这不是只是对实例对象的属性的修改么?object1不是还是引用的是Object的实例么?
问题有点多哈,在此先谢过了。
var object1 = new Object(); // 声明变量,计数器由 0 变为 1
object1.method1 = "This is object1"; // object1 计数器 -1,object1 读数变为0
}
这里object1的引用次数是1
第二句object1并没有指向其他对象,而是定义并给object1的属性进行了赋值
变量是引用这个值的变量
另一个值是其他的对象的引用
例如这里的值是object1指向的对象
变量是object1
另一个值可以是new Object()
object1.method1 = "This is object1";
这句话应该只是对object1的值指向的对象的属性的修改么?为什么说object1又取得了另外一个值呢?
每new一次Object都会new出不同的对象
不妨做下试验吧
function countMethod(){
var object1 = new Object(); // 声明变量,计数器由 0 变为 1
object1.method1 = "This is object1"; // object1 计数器 -1,object1 读数变为0
alert(typeof object1);
}
countMethod();
返回的是object
说明对象是存在的,也就是object1.method1 = "This is object1"; // object1 计数器 -1,object1 读数变为0
这一句不对
应该是读数!0
function countMethod(){
var object1 = new Object(); // 声明变量,计数器由 0 变为 1
object1.method1 = "This is object1"; // object1 计数器 -1,object1 读数变为0
alert(object1 instanceof Object);
}
countMethod();
因为null的typeof也是object