栈内存和堆内存理解
栈 stack”和“堆 heap”
stack上分配的内存系统自动释放,heap上分配的内存,系统不释放,哪怕程序退出,那一块内存还是在那里。 stack一般是静态分配内存(基本类型),heap上一般是动态分配内存(引用类型)。
基本类型和引用类型
基本类型:存放在栈内存中的简单数据段。数据大小确定,内存空间大小可以分配。 5种基本数据类型有Undefined、Null、Boolean、Number 和 String,它们是直接按值存放的,所以可以直接访问
引用类型:存放在堆内存中的对象,变量中实际保存的是一个指针,这个指针指向另一个位置。每个空间大小不一样,要根据情况开进行特定的分配。 当我们需要访问引用类型(如对象,数组,函数等)的值时,首先从栈中获得该对象的地址指针,然后再从堆内存中取得所需的数据。
执行环境(作用域)
- 执行环境决定了变量的生命周期,一些代码可以访问变量的权限。这种机制有助于何时释放内存。
- 分全局执行环境(window)和函数执行环境。
- 函数的局部环境可以访问函作用域的变量,而且有权访问包含(父)环境中的变量
- 全局环境不能访问函数环境中的变量。
传值与传址
基本类型与引用类型最大的区别实际就是传值与传址的区别
浅拷贝
function Copy(p) {
var c = {};
for (var i in p) {
c[i] = p[i];
}
return c;
}
深拷贝
function Copy(p, c) {
var c = c || {};
for (var i in p) {
if (typeof p[i] === 'object') {
c[i] = (p[i].constructor === Array) ? [] : {};
Copy(p[i], c[i]);
} else {
c[i] = p[i];
}
}
return c;
}