Open oliver1204 opened 6 years ago
为了不让程序员费心分配内存,JavaScript 在定义变量时就完成了内存分配。JavaScript 的变量类型分为两种:基本类型和引用类型。而在JavaScript 中内存也分为栈内存和堆内存两种。
基本类型包括:Undefined,Null,Number,String,Boolean类型的值。 引用类型包括: Object,Function,Array等类型。
一般来说,栈内存中存放的是存储对象的地址,而堆内存中存放的是存储对象的具体内容。对于原始类型的值而言,其地址和具体内容都存在与栈内存中;而基于引用类型的值,其地址存在栈内存,其具体内容存在堆内存中。堆内存与栈内存是有区别的,栈内存运行效率比堆内存高,空间相对推内存来说较小,反之则是堆内存的特点。
var str = "Hello World"; // str:"Hello World"存在栈中 var obj = {value:"Hello World"}; // obj存在栈中,{value:"Hello World"}存在堆中,通过栈中的变量名obj(访问地址)访问
1.当对象将被需要的时候为其分配内存 2.使用已分配的内存(读、写操作) 3.当对象不在被需要的时候,释放存储这个对象的内存
var str_a = "a"; // 为str_a分配栈内存:str_a:"a" var str_b = str_a; // 原始类型直接访问值,so,为str_b新分配栈内存:str_b:"a" str_b = "b"; // 栈内存中:str_b:"b"。str_b的值为"b",而str_a的值仍然是"a" // 分隔 str 和 obj -----------------------------------------------------------// var obj_a = {v:"a"}; // 为obj_a分配栈内存访问地址:obj_a,堆内存中存对象值:{v:"a"}; var obj_b = obj_a; // 为obj_b分配栈内存访问地址:obj_b,引用了堆内存的值{v:"a"} obj_b.v = "b"; // 通过obj_b访问(修改)堆内存的变量,这时候堆内存中对象值为:{v:"b"},由于obj_a和obj_b引用的是堆内存中同一个对象值,所以这时候打印都是{v:"b"} obj_b = {v:"c"}; // 因为改的是整个对象,这里会在堆内存中创建一个新的对象值:{v:"c"},而现在的obj_b引用的是这个对象,所以这里打印的obj_a依旧是{v:"b"},而obj_b是{v:"c"}(两者在内存中引用的是不同对象了)。
js引擎线程 无论什么时候都只有一个 JS 线程在运行 JS 程序, 想象一下,如果js 也是多线程的,就会出现这种情况:A 线程 在一个 DOM 节点插入一个元素,此时 B 线程 要删除这个节点,那么这个时候就会出现错乱的现象。
js线程——>http线程——>事件触发线程(把回调插入js线程尾部)——>js线程
setTimeout/setInterval 定时触发器线程(完成之后插入js线程尾部)——>js线程
垃圾回收的目的是,当内存不再需要使用时释放,并回收。
这是最简单的垃圾收集算法。
http://blog.csdn.net/web_lc/article/details/72920029
JavaScript 栈内存和堆内存
为了不让程序员费心分配内存,JavaScript 在定义变量时就完成了内存分配。JavaScript 的变量类型分为两种:基本类型和引用类型。而在JavaScript 中内存也分为栈内存和堆内存两种。
基本类型包括:Undefined,Null,Number,String,Boolean类型的值。 引用类型包括: Object,Function,Array等类型。
一般来说,栈内存中存放的是存储对象的地址,而堆内存中存放的是存储对象的具体内容。对于原始类型的值而言,其地址和具体内容都存在与栈内存中;而基于引用类型的值,其地址存在栈内存,其具体内容存在堆内存中。堆内存与栈内存是有区别的,栈内存运行效率比堆内存高,空间相对推内存来说较小,反之则是堆内存的特点。
对象生命周期
1.当对象将被需要的时候为其分配内存 2.使用已分配的内存(读、写操作) 3.当对象不在被需要的时候,释放存储这个对象的内存
浏览器堆栈
js引擎线程 无论什么时候都只有一个 JS 线程在运行 JS 程序, 想象一下,如果js 也是多线程的,就会出现这种情况:A 线程 在一个 DOM 节点插入一个元素,此时 B 线程 要删除这个节点,那么这个时候就会出现错乱的现象。
js线程——>http线程——>事件触发线程(把回调插入js线程尾部)——>js线程
setTimeout/setInterval 定时触发器线程(完成之后插入js线程尾部)——>js线程
垃圾回收的方式
垃圾回收的目的是,当内存不再需要使用时释放,并回收。
引用计数垃圾收集
这是最简单的垃圾收集算法。
http://blog.csdn.net/web_lc/article/details/72920029