1.EMCAScript规定,数字都是64位存储的,字符串都是16位存储的。
2.简单类型直接存储在stack中,复杂类型(obj)将Heap地址存到stack中。
3.对象中self的用法:
错误用法:
var a = {self: a}
console.log(a.self) //undefined
a是undefined,因为出现变量提升。实际代码为
var a ;
a={self: a}
console.log(a.self)//undefined
赋值给self的a是第一行的a,实际的值是undefined。
正确用法:
var a= { };
a.self=a;
console.log(a.self) //a
这里的a.self是对象a。
4.面试题
1.【引用】
var a= {n:1};
var b=a;
a.x= a = {n: 2};
alert(a.x); //undefined
alert(b.x); //[object Object] , alert会调用toString()方法
解析:
题1解析
代码第三行的赋值,是从右往左赋值,所以中间的a其实指向的是ADDR22,左边的a.x的a指向的是ADDR21,根据内存图显示a.x为undefined,b.x为对象ADDR22,alert调用toString()方法,所以b.x为[object Object]。
2.【持续引用】
var fn = function(){ };
document.body.onclick = fn;
fn = null;
题2解析
前两句代码如图,当fn=null时,也就是将stack中的ADDR33替换成null,同时heap中的内存不存在垃圾。
但是,当
document.body.onclick = null
时,fn就是一个垃圾,应该被回收。如果将浏览器关闭,那么heap中的所有内存都将是垃圾,因为连document都没有了。这时垃圾就会被回收,但是IE6中存在bug。
垃圾回收:如果一个对象没有被引用,它就是垃圾,将被回收。垃圾回收的实质是找一个树的根。
内存泄漏:由于浏览器的bug导致一些该被标记为垃圾的东西没有被标记成垃圾,内存就会被永久占用,除非将整个浏览器关掉。
若浏览器没有关闭,IE6存在内存泄漏bug,不会认为heap中没有被引用的的相连内存块是垃圾,解决办法:
window.onunload = function(){
document.body.onclick = null ;
}
网友评论