JS里的内存图

发布 : 2019-05-08 分类 : JavaScript 浏览 :

1、内存图

当我们打开浏览器时,会占用一些内存,浏览器会把内存分布给网页,然后会分配给html、css、js、网络还有插件等等。

JS引擎得到的内存又会分布给代码区数据区。在数据区里又分Stack栈内存Heap堆内存。简单类型的数据会被存在Stcak栈内存里,复杂类型的数据是把 Heap 地址存在 Stack 里。

1.1 题目1

请问a等于多少?
内存图题1
答:a = 1
内存图题1答案

1.2 题目2

请问a.name等于多少?
内存图题2
答:a.name = ‘a’
内存图题2答案

1.3 题目3

请问a.name等于多少?
内存图题3
答:a.name = ‘b’
内存图题3答案

1.4 题目4

请问a等于多少?
内存图题4
答:a= { name: ‘a’ }
内存图题4答案

1.5 面试题

面试题目
答:

1
2
a.x   //undefined
b.x //{n: 2}

面试题内存图
注意:a.x = a = {n:2}中,当浏览器看到这句话时会先确认a是什么,因此其中的两个a最开始都是50,然后再用右往左执行。

2、GC垃圾回收机制

这个页面用完了的内存,将还给浏览器,浏览器再给别的页面。

如果一个对象没有被引用,它就是垃圾,将被回收。

例:请问fn是不是垃圾?
垃圾回收
答:不是。
垃圾回收答案

假如把页面关了,那fn是不是垃圾呢?

答:是,因为把页面关了,document就不存在了,也就是说这个内存中没有document对象。
但是在IE里有bug,它认为上图中10、20、30这三个东西不是垃圾,会把这些一直留着,只要不把整个网页关掉,就会一直存在着。

如何解决呢?
我们需要把所有的事件监听置为null。
事件监听

3、内存泄漏

由于浏览器的一些bug,使得该被标记为垃圾的东西,没有被标记为垃圾,然后内存就会被永久的占用着,除非你把整个浏览器给关了。

4、浅拷贝与深拷贝

深拷贝:

1
2
3
4
var a = 1
var b = a
b = 2
a //1

像上面这种b改变了值,而a却没有改变,这种就叫深拷贝。
对于所有的基本类型,进行简单的赋值就是深拷贝。

1
2
3
4
var a = {name:'zww'}
var b = a
b.name = 'lq'
a.name //'lq'

像上面代码中,改变了b,从而也导致a改变了,这种就叫浅拷贝。

本文作者 : LqZww
原文链接 : http://yoursite.com/2019/05/08/js-li-de-nei-cun-tu/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
支付宝扫一扫, 向我赞赏

支付宝扫一扫, 向我赞赏

微信扫一扫, 向我赞赏

微信扫一扫, 向我赞赏

留下足迹