javascript的内存管理
Javascript 是那些被称作垃圾回收语言当中的一员。垃圾回收语言通过周期性地检查那些之前被分配出去的内存是否可以从应用的其他部分访问来帮助开发者管理内存。换句话说,当计算机发现有的内存已经不能被访问到了,就会把它们标记为垃圾。开发者只需要知道一块已分配的内存是否会在将来被使用,而不可访问的内存可以通过算法确定并标记以便返还给操作系统。
引用传递和值传递
js中的变量除了6个基本类型以外,其余的都是对象。也就说基本类型在赋值是传递的是值,也就是原来数据的一份拷贝。基本类型包括number、string、boolean、symbol、null、undefined.
用2个例子来理解一下:
值传递
var a = 10; //基本类型
var b = a; //a把10拷贝一份,把这个拷贝给b
a = 20; //修改了a,不影响a的拷贝
console.log(a); //20
console.log(b); //10
复制代码
引用传递
var a = {num: 20}; //不是基本类型
var b = a; //这里没有任何拷贝工作,b指向和a完全一致的同一块内存
b.num = 15; //由于b和a指向同一块内存,所以b.num修改了等同于a.num修改了
console.log(a.num); //15
console.log(b.num); //15//进一步理解
b = {age: 10}; //等号右边定义了一个新的对象,产生的新的内存分配,此时b指向了这块新的内存,a还是指向原来那块内存
console.log(a); //{num: 15}
console.log(b); //{age: 10}
复制代码
垃圾回收与内存泄漏
垃圾回收(Garbage Collection),简称GC。简单来讲,GC就是把内存中不需要的数据释放了,这样这部分内存就可以存放其他东西了。在javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。具体回收策略包括以下3种:
标记回收
当从window节点遍历DOM树不能遍历到某个对象,那么这个对象就会被标记为没用的对象。由于回收机制是周期性执行的,这样,当下一个回收周期到来时,这个对象对应的内存就会被释放。
引用计数
当系统中定义了一个对象后,对于这一块内存,javascript会记录有多少个引用指向个部分内存,如果这个数为零,则这部分内存会在下一个回收周期被释放。
手动释放
就好比上一个例子中,利用delete关键字删除变量或属性,达到释放内存的目的。