js中的堆和栈
这里先说两个观点:1、堆(heap)2、栈(stack)
堆 是堆内存的简称。
栈 是栈内存的简称。
说到仓库,我们讲的就是内存的使用和分配了,没有寄存器的事,也没有硬盘的事。
各类语言在措置惩罚惩罚仓库的道理上都大同小异。堆是动态分配内存,内存巨细不一,也不会自动释放。栈是自动分配相对固定巨细的内存空间,并由系统自动释放。
javascript的根基类型就5种:Undefined、Null、Boolean、Number和String,它们都是直接按值存储在栈中的,每种类型的数据占用的内存空间的巨细是确定的,并由系统自动分配和自动释放。这样带来的好处就是,内存可以及时得到回收,相对付堆来说,越发容易打点内存空间。
javascript中其他类型的数据被称为引用类型的数据 : 如东西(Object)、数组(Array)、函数(Function) …,它们是通过拷贝和new出来的,这样的数据存储于堆中。其实,说存储于堆中,也不太准确,因为,引用类型的数据的地点指针是存储于栈中的,当我们想要访谒引用类型的值的时候,需要先从栈中获得东西的地点指针,然后,在通过地点指针找到堆中的所需要的数据。
说来也是形象,栈,线性布局,后进先出,便于打点。堆,一个混沌,杂乱无章,便利存储和斥地内存空间
传值与传址
上方例子得知,当我转变arr2中的数据时,arr1中数据也产生了变革,,当转变str1的数据值时,arr1却没有产生转变。为什么?这就是传值与传址的区别。
因为arr1是数组,属于引用类型,所以它赋予给arr2的时候传的是栈中的地点(相当于新建了一个差别名“指针”),而不是堆内存中的东西的值。str1得到的是一个根基类型的赋值,因此,str1仅仅是从arr1堆内存中获取了一个数值,并直接生存在栈中。arr1、arr2都指向同一块堆内存,arr2改削的堆内存的时候,也就会影响到arr1,str1是直接在栈中改削,并且不能影响到arr1堆内存中的数据。
浅拷贝和深拷贝
上边说到的赋值方法就是浅拷贝,那么什么叫作深拷贝呢?就是要将arr1的每个根基类型的数据都遍历一遍,依次的赋值给arr2的对应字段。制止孕育产生因为地点引用带来的问题。
var arr1 = [1,2,5,8]; var arr2 = []; for(var i=0;i<arr1.length;i++){ arr2[i]=arr1[i]; }; console.log(arr2)//1,2,5,8 arr2[4]=99; console.log(arr2)//1,2,5,8,99 console.log(arr1)//1,2,5,8javascript面向东西的语言自己在措置惩罚惩罚东西和非东西上就进行了划分,从数据布局的角度来讲,东西就是栈的指针和堆中的数值。
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30441.html