共计 1395 个字符,预计需要花费 4 分钟才能阅读完成。
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 本来对应的值失去援用, 脱离执行环境. 这个值会在下一次垃圾收集器执行开释操作时给去除掉.
- 部分作用域中, 函数执行结束. 局部变量也就没有存在的必要了, 因而垃圾收集器很容易做出回收判断, 然而全局作用域的变量什么时候须要主动开释存储空间, 很难判断. 因而在开发过程中, 须要尽量避免应用全局作用域