var a = 20;var b = abc;var c = true;var d = {m: 20}

因为javascript有垃圾回收机制, 所以对前端开发来说, 内存空间是一个常常被忽视的内容, 然而了解内存空间, 对了解根本数据类型和援用数据类型的值传递是怎么回事, 深拷贝和浅拷贝原理. 还有闭包,原型等都用很大作用

在理解内存空间前, 咱们得先意识堆, 栈 以及队列

栈数据结构

javascript其实并没有严格意义上辨别栈内存和堆内存. 因而咱们能够粗犷的认为javascript的所有内存都放弃在堆内存中.然而某些场景咱们必须得须要基于堆栈数据结构的数据结构来了解. 比方执行上下文的执行程序应用了栈数据结构的存取形式.
栈的存取形式

栈空间的特点是先进后出, 后进先出

堆数据结构特点

堆数据结构是一种树形构造, 它存取数据的格局和书与书架十分类似,只有晓得书的名字, 很快就能拿出书, 好比json数据, 存储的key-value能够是无序的, 只有晓得key就能够拿出数据

队列

在js中,了解队列数据结构是为了了解事件循环event loop的机制.
队列是一种先入先出的数据结构

变量对象和根底数据类型

javascript上下文生成后,会创立一个叫变量对象的非凡对象,javascrit根本类型数据会贮存在这个变量对象里
javascript中根底数据类型包含 string number boolean undefined null等. 根底数据类型都是按值拜访.

援用数据类型和堆内存

js的援用数据类型的值是保留在堆内存中的对象.js不容许间接拜访堆内存中的地位.因而咱们不能间接操作对象的堆内存空间, 在操作对象时,其实是操作的对象的援用,而不是这个对象. 因而援用数据都是依照援用拜访. 这个援用能够了解为保留在变量对象中的一个地址.改地址与堆内存理论值相关联.

var a1 = 0;   // 变量对象var a2 = 'this is string'; // 变量对象var a3 = null; // 变量对象var b = { m: 20 }; // 变量b存在于变量对象中,{m: 20} 作为对象存在于堆内存中var c = [1, 2, 3]; // 变量c存在于变量对象中,[1, 2, 3] 作为对象存在于堆内存中

因而咱们要拜访堆内存中援用类型数据时, 其实是先从获取变量对象中的获取了该数据对象的地址援用, 而后再从堆内存中找到该数据

var a = 20;var b = a;b = 30;// a的值为20
var m = { a: 10, b: 20 }var n = m;n.a = 15;// m.a的值为15

内存空间治理

javascript的内存生命周期

  • 调配你所须要的内存
  • 应用你所调配的内存
  • 不须要时,将其开释

为了便于了解,请看上面例子

    var a = 20; // 在内存中给数值调配空间    alert(a+10) // 应用内存    a= null 应用实现后,开释内存空间

javascript 有个垃圾回收机制.就是找出那些不再应用的值,而后开释其占用的内存.垃圾收集器就会每隔固定的时间段就执行一次开释操作.
在js中,通常是应用标记算法来示意该值不被应用. 因而a=null仅仅是做了一次开释援用的操作.让a本来对应的值失去援用,脱离执行环境. 这个值会在下一次垃圾收集器执行开释操作时给去除掉.

  • 部分作用域中,函数执行结束.局部变量也就没有存在的必要了, 因而垃圾收集器很容易做出回收判断, 然而全局作用域的变量什么时候须要主动开释存储空间, 很难判断. 因而在开发过程中,须要尽量避免应用全局作用域