js堆内存、栈内存以及js深拷贝、浅拷贝以及javascript
js基本数据类型:
数字(number)、字符串(string)、布尔类型(boolean)、未定义(undefined)、空(null)、Symbol(ES6,唯一值)
js引用数据类型:
数组(array)、对象(object)、函数(function)
堆、栈内存以及垃圾回收机制
栈内存:基本数据类型放在栈内存中,它由系统自动释放,在全局作用域时页面关闭时释放、局部作用域时函数执行完成时释放。
栈内存局部作用域下,特殊情况不销毁:
(1)函数执行返回一个引用类型的值,且在别的作用域被接收了,该栈内存不会被销毁
(2)私有作用域中,给DOM元素的事件绑定方法,该栈内存不会被销毁
堆内存:引用数据类型声明的变量、以及指向堆内存的指针存放在栈内存中,对象、函数存放到堆内存中。通过变量的指针指向堆内存的对象所以叫引用类型。
变量被声明、引用时无法销毁,可以通过赋值空对象指针null,浏览器在空闲时间,实现堆内存的销毁或回收(垃圾回收机制)。
垃圾回收机制:
1、标记清除
这是javascript中最常用的垃圾回收方式。当变量进入执行环境是,就标记这个变量为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到他们。当变量离开环境时,则将其标记为“离开环境”。
垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记。然后,它会去掉环境中的变量以及被环境中的变量引用的标记。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后。垃圾收集器完成内存清除工作,销毁那些带标记的值,并回收他们所占用的内存空间。
2、引用计数
另一种不太常见的垃圾回收策略是引用计数。引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型赋值给该变量时,则这个值的引用次数就是1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数就减1。当这个引用次数变成0时,则说明没有办法再访问这个值了,因而就可以将其所占的内存空间给收回来。这样,垃圾收集器下次再运行时,它就会释放那些引用次数为0的值所占的内存。
深拷贝、浅拷贝:
什么是拷贝,我的理解就是赋值,只有引用类型才会涉及到深拷贝、浅拷贝。
浅拷贝的理解:
就是A对象指针指向了一个堆内存,A对象赋值给B后(浅拷贝),B的指针也指向了同一个堆内存(不创建新的堆内存),这样只要改变A的堆内存,A对象、B对象都会改变。
浅拷贝就是赋值引用地址/指针。
深拷贝的理解:
A对象指针指向一个堆内存,A对象赋值给B后(深拷贝),B的指针也指向了新建的堆内存(创建新的堆内存),A的堆内存改变、B的不会跟着改变。
深拷贝就是在堆中创建一个与A一样的堆内存,B指向它。