简介:
每种编程语言都有它自己的内存管理机制。我们在学习JavaScriptr时也需要了解它的内存管理机制。JavaScript的内存管理机制是:内存在变量创建时分配,然后在它们不被使用时'自动'释放。自动释放这个过程也被称之为垃圾回收。之前我没怎么注意到这个概念,这就导致了后面很多东西理解不那么透彻。比如最基本的引用数据类型和引用传递到底是怎么回事儿?比如浅复制与深复制有什么不同?还有闭包,原型等等。内存模型(栈与堆)
JS内存空间空间分为栈内存和堆内存,它们存储数据的机制不同,导致s存储的数据类型也不同。栈内存:栈会自动分配内存,物理内存是连续的,存放基本类型,简单的数据段,占据固定的大小空间。
基本类型:String、Number、Boolean、Null、Undefined
堆内存:动态分配的内存,物理地址不连续,大小不定也不会自动释放,存放引用类型,指那些可能由多个值构成的对象,保存在堆内存中;包含引用类型的变量,实际上保存的不是变量本身,而是指向该对象的指针。
引用类型:Function Array Object
堆与栈的区别
栈:所有在方法中定义的变量都是放在栈内存中的,随着方法的执行结束,这个方法的内存栈也自然销毁。优点:存取速度比堆快,仅次于直接位于CPU中的寄存器,数据可共享。
缺点:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
传值和传址的区别
这两种的区别就是基本类型和引用类型的区别(一般来说基本类型的数据是传址,引用类型的数据是传址)传值:当一个数据通过值被操作,所关系到的是数据的值,当一份数据通过值传递给一个函数时,数据的一份拷贝传递给了函数,如果函数修改了这个值,修改的仅仅是该数据的拷贝,并不影响原始的数据。 如:
var a=1;
b=a;
a=3;
console.log(b) //1 a 值的改变并不能影响b
传址:这种方法数值只有一份真实的数据,被操作的是该值的存放地址。如果以传址的方式操作一个值,变量并不会直接存储该值,只存储该值的地址,被赋值、传递、比较的都是该地址。 如:
var a={n:1};
var b=a;
a.n=3;
console.log(b,a==b)//{n: 1, b: 3} true
四.深拷贝和浅拷贝
浅拷贝:拷贝z时只复制了第一层属性,复制对象时基本类型。在复制基本类型时直接使用等号完成,在复制引用类型时,循环遍历对象,对每个属性值使用等号复制完成。深拷贝:对属性中所有引用类型的值,遍历到是基本类型的值为止,利用递归来实现深拷贝。