当前位置: 首页 > 科技观察

JavaScript变量的内存分配你了解多少?

时间:2023-03-15 23:46:37 科技观察

JavaScript的所有变量(包括函数)在整个处理过程中都保存在内存中,所以需要对一个变量进行处理。首先,必须为变量分配内存。JavaScript内存分配和其他语言一样,根据变量的数据类型分配内存,而JavaScript变量的数据类型由赋值的类型决定。JavaScript支持的数据类型可以分为两类:基本数据类型和复杂数据类型。其中,基本数据类型包括数字(number)类型、字符串(string)类型、布尔(boolean)类型、未定义(undefined)类型、空(null)类型;复杂类型包括对象(object)类型,JavaScript中的数组和函数都是对象类型。除了原始数据类型之外的数据类型都是对象类型。在JavaScript中,基本数据类型的变量分配在栈内存中,栈内存中存放变量的值,按值访问;而object类型的变量会同时分配栈内存和堆内存,栈内存存放地址。堆内存存放引用的值,栈内存存放的地址指向堆内存存放的值。对变量的访问采用引用访问,即先读取栈内存中存放的地址,然后根据地址找到堆内存读取其中的值。JavaScript根据变量的不同数据类型分配内存的主要原因是栈内存比堆内存小,栈内存的大小是固定的,而堆内存的大小是可以动态改变的。基本数据类型的值的大小是固定的,而对象类型的值的大小是不固定的,所以将它们分别存放在栈内存和堆内存中是合理的。functionStudent(id,sno,name,age){//函数定义,Student是一个函数变量this.id=id;this.sno=sno;this.name=name;this.age=age;}varnum=20;//num是一个数字变量varbol=false;//bol是一个布尔变量varstr="student";//str是一个字符串变量varobj={};//obj是一个对象变量vararr=['a','b'];//arr是一个数组变量varstudent=newStudenta(1,"199706010016","maomin",23);//student是一个对象变量上面代码中的Student变量定义了一个构造函数,函数的定义代码存放在堆内存中,内存对应的地址存放在Student函数变量中。该构造函数用于创建一个对象实例,最后一行代码使用该构造函数创建了一个名为maomin的学生对象实例。student实例创建后,会返回其在堆内存中分配的地址,该地址赋值给student变量。上面代码中的{}在堆内存中创建了一个空对象,并将该对象在堆内存中的地址赋值给obj这个变量。['a','b']是一个数组对象,其元素值分别为'a'和'b'。这个对象也存放在堆内存中,其对应的地址赋值给arr变量。除了变量Student、obj、arr、student是对象变量外,其他变量num、bol、str都是基本数据类型的变量,所以都存在栈内存中。基本数据类型的变量值存储在栈内存中,而对象类型变量,包括函数、数组和对象,只存储引用对象在栈内存中的地址,也就是对象在栈内存中分配的地址堆内存,所以通过这个地址可以找到对象类型的变量值。