JS当中的堆与栈
首先,堆与栈都是开辟的内存。
栈内存中存贮的是JS基础数据类型数据,如Number,String,布尔值,null,undefind等,这些值占据的内存空间小。栈内存遵循是的先进后出,后进先出的规则,像我们存放光盘一样,第一张光盘放在最底层,而最后一张光盘放在最顶层,当我们需要使用最后一张光盘时,因为最后一张光盘在最顶层,所以他是最先拿出来的,而我们想使用第一张光盘时,则需要把中间的光盘依次取出才能使用第一张,所以这样理解栈内存的先进后出,后进先出即可。
堆内存中存贮的是引用数据类型,如Object,Array,Function,这些数据类型复杂且数据量大小不固定,需要动态开辟计算大小。堆内存则是想何时添加就何时添加,想何时去除就何时去除。
并且这些引用类型的变量名会存贮与栈内存中,变量存贮的是一个指向于堆内存的一个地址,当我们访问这些引入类型时,通过栈内存中的内存指向访问堆内存。
所以当我们使用浅拷贝时,如果拷贝的是基础数据类型,那则是栈内存中基础类型值的复制,而拷贝复杂数据类型时,复制的是栈内存中存贮的指向堆内存的地址,因为指向的都是一个堆内存,所以当我们浅拷贝后修改浅拷贝后的对象后,实则修改的是堆内存中的对象,则我们浅拷贝的对象属性也发生改变。
当我们使用深拷贝时,基数数据类型不变,而引入数据类型则是在堆内存新开辟一个内存地址,复制你拷贝对象的所有值存入新的内存地址中,栈内存中的变量指向于新的堆内存地址。
浅拷贝:Object.assign,jQuery extents
深拷贝:JSON.parse(JSON.stringify(object)),循环递归
搬砖工的自我理解~~