最近因为项目需求涉及到很多数据处理,想了解javascript中的数据类型,于是在百度上找了下一些干货,这里我会简化并记下,方便以后有需要的时候查看:这里先介绍两个概念:1.堆(heap)2.栈(stack)堆是的缩写堆内存。Stack是栈内存的简称。说到栈,我们说的是内存的使用和分配,没有寄存器,也没有硬盘。各种语言处理栈的原理都差不多。堆是动态分配内存,内存大小不同,不会自动释放。栈是一个相对固定大小的内存空间,由系统自动分配和自动释放。javascript有五种基本类型:Undefined、Null、Boolean、Number和String,按值直接存储在栈中。每种数据占用的内存空间大小由系统自动分配和自动释放。这样做的好处是可以及时回收内存,而且比堆更容易管理内存空间。javascript中的其他类型的数据称为引用类型数据:比如对象(Object)、数组(Array)、函数(Function)……,它们是copied和new的,这类数据存放在堆中。其实说存放在堆中并不准确,因为引用类型数据的地址指针存放在栈中。当我们要访问引用类型的值时,需要先从栈中获取对象的地址。然后指针通过地址指针在堆中找到需要的数据。它也是一个图像,堆栈,线性结构,后进先出,便于管理。堆,一个杂乱无章的,方便存储和开辟内存空间的传递值和地址vararr1=[1,2,5,8];vararr2=arr1;varstr1=arr1[2];console.log(arr2);//1,2,5,8console.log(str1);//5arr2[4]=99;str1=6;console.log(arr1);//1,2,5,8,99console.log(arr1[2]);//5上面的例子表明,当我改变arr2中的数据时,arr1中的数据也改变了,但是当我改变str1的数据值时,arr1并没有改变。为什么?这就是按值传递和按引用传递的区别。因为arr1是数组,属于引用类型,所以赋值给arr2时,传递的是栈中的地址(相当于新建了一个不同名字的“指针”),而不是堆中对象的值记忆。str1得到的是一个基本类型的赋值,因此,str1只是从arr1堆内存中取一个值,直接保存在栈上。arr1和arr2都指向同一个堆内存。当arr2修改堆内存时,也会影响到arr1。str1直接在栈上修改,不能影响arr1堆内存中的数据。浅拷贝与深拷贝上面说的赋值方式是浅拷贝,那么什么是深拷贝呢?就是遍历arr1中的每一个基本类型的数据,依次赋值给arr2的对应字段。避免由地址引用引起的问题。vararr1=[1,2,5,8];vararr2=[];for(vari=0;i
