栈内存和堆内存理解

栈 stack”和“堆 heap”

stack上分配的内存系统自动释放,heap上分配的内存,系统不释放,哪怕程序退出,那一块内存还是在那里。 stack一般是静态分配内存(基本类型),heap上一般是动态分配内存(引用类型)。

基本类型和引用类型

基本类型:存放在栈内存中的简单数据段。数据大小确定,内存空间大小可以分配。 5种基本数据类型有Undefined、Null、Boolean、Number 和 String,它们是直接按值存放的,所以可以直接访问

引用类型:存放在堆内存中的对象,变量中实际保存的是一个指针,这个指针指向另一个位置。每个空间大小不一样,要根据情况开进行特定的分配。 当我们需要访问引用类型(如对象,数组,函数等)的值时,首先从栈中获得该对象的地址指针,然后再从堆内存中取得所需的数据。

执行环境(作用域)

  1. 执行环境决定了变量的生命周期,一些代码可以访问变量的权限。这种机制有助于何时释放内存。
  2. 分全局执行环境(window)和函数执行环境。
  3. 函数的局部环境可以访问函作用域的变量,而且有权访问包含(父)环境中的变量
  4. 全局环境不能访问函数环境中的变量。

传值与传址

基本类型与引用类型最大的区别实际就是传值与传址的区别

浅拷贝

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;
}

results matching ""

    No results matching ""