参考文档
一、简单类型和复杂类型
基本类型又叫做值类型,复杂类型又叫做引用类型
- 值类型:简单数据类型,基本数据类型,在存储时,变量中存储的是值本身,因此叫做值类型。
- 引用类型:复杂数据类型,在存储是,变量中存储的仅仅是地址(引用),因此叫做引用数据类型。
堆和栈:
堆栈空间分配区别:
1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;
2、堆(操作系统): 存储复杂类型(对象),一般由程序员分配释放, 若程序员不释放,由垃圾回收机制回收,分配方式倒是类似于链表。
1-1 基本类型在内存中的存储
1-2 复杂类型在内存中的存储
1-3 基本类型作为函数的参数
1-4 复杂类型作为函数的参数
https://www.cnblogs.com/liuyushao/p/6875341.html
1-5 值传递和址传递
//值传递
var a = 1;
var b = 2;
function changeA(a,b){
var tmp = a;
a = b;
b = tmp;
}
changeA(a,b);
console.log(a,b);
//址传递
var a = [1,2];
function changeB(a){
var tmp = a[0];
a[0] = a[1];
a[1] = tmp;
}
changeB(a);
console.log(a);
二、内存管理
2-1 JS中垃圾收集机制原理
- 垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间), 周期性地执行这一操作:找出那些不再继续使用的变量,然后释放其占用的内存。
2-2 管理方法
1.引用计数法
原理:
- 当JavaScript代码生成一个新的内存驻留项时(比如一个对象或函数),系统就会为这个项留出一块内存空间。因为这个对象可能会被传递给很多函数,并且会被指定给很多变量,所以很多代码都会指向这个对象的内存空间。JavaScript会跟踪这些指针,当最后一个指针废弃不用时,这个对象占用的内存会被释放。
缺点:
- 内存泄漏问题(内存泄漏是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果)
- 循环引用问题
2.标记清除法
标记清除算法由以下步骤组成:
- 垃圾回收器构建”roots”列表。Roots通常是代码中保留引用的全局变量。在JavaScript中,”window”对象可以作为 root 全局变量示例。
- 所有的”roots”被检查并标记为active(即不是垃圾)。所有的children也被递归检查。从”root”能够到达的一切都不被认为是垃圾。
- 所有为不被标记为active的内存可以被认为是垃圾了。收集器限制可以释放这些内存并将其返回到操作系统。