大白话理解内存
- 你买一个 8G 的内存条
- 操作系统开机即占用 512MB
- Chrome 打开即占用 1G 内存
- Chrome 各每个网页分配一定数量的内存
- 这些内存要分给页面渲染器、网络模块、浏览器外壳和 JS 引擎(V8引擎)
- JS 引擎将内存分为代码区和数据区
- 我们只研究数据区
- 数据区分为 Stack(栈内存) 和 Heap(堆内存)
- 简单类型的数据直接存在 Stack 里
- 复杂类型的数据是把 Heap 地址存在 Stack 里
学习内存图的好处
- 最基本的引用数据类型和引用传递到底是怎么回事儿?
- 垃圾回收机制是怎么一回事?
- 比如浅复制与深复制有什么不同?
- 什么是闭包
- 什么是原型
面试题
1.引用数据类型和引用传递
var a = 1
var b = a
b = 2
请问 a 显示是几?
var a = {name: 'a'}
var b = a
b = {name: 'b'}
请问现在 a.name 是多少?
var a = {name: 'a'}
var b = a
b.name = 'b'
请问现在 a.name 是多少?
var a = {name: 'a'}
var b = a
b = null
请问现在 a 是什么?
2.引用自身
正确写法:
var a={}
a.self=a
错误写法
var a={self:a}
等价于
var a
a={self:a}
赋值时要先确定右边
var a={n:1}
var b=a
a.x=a={n:2}
alert(a.x) //undefined
alert(b.x) //[object Object]
当浏览器看到 a.x=a={n:2} 这句话的时候,是先看左边, 所以a.x地址为中的a为34,再看右边,只不过看到右边,把右边的值算完后再回到左边
3.垃圾回收
垃圾:如果一个对象没有被引用,它就是垃圾,将被回收,还给浏览器,操作系统
举例1:
举例2:
问这个函数是不是垃圾(不是垃圾)
var fn=function(){}
document.body.onclick=fn
fn=null
如果将这个页面关掉,fn是否为垃圾? (不是垃圾)
但是IE6有bug,认为上面那个不是垃圾,所以页面关掉时就会一直占着内存,像这样的情况就是内存泄漏。那如何解决?
window.onunload=function(){
document.body.onclick=null
}
4.浅拷贝与深拷贝
改变其中一个值的同时并不改变另一个值,基本类型的赋值都是深拷贝