在JS中关于堆与栈的认识function abc(a){ a=100; } function abc2(arr){ arr[0]=0; }

时间:2021-04-10 05:52:32

    平常我们的印象中堆与栈就是两种数据结构,栈就是先进后出;堆就是先进先出。下面我就常见的例子做分析:

main.cpp

int a = 0; 全局初始化区

char *p1; 全局未初始化区

main()

{

int b; 栈

char s[] = "abc"; 栈

char *p2; 栈

char *p3 = "123456"; 123456\0在常量区,p3在栈上。

static int c =0; 全局(静态)初始化区

p1 = (char *)malloc(10); 堆

p2 = (char *)malloc(20); 堆

}

不知道你是否有点明白了,堆和栈的第一个区别就是申请方式不同:栈(英文名称是stack)是系统自动分配空间的,例如我们定义一个 char a;系统会自动在栈上为其开辟空间。而堆(英文名称是heap)则是程序员根据需要自己申请的空间,例如malloc(10);开辟十个字节的空间。由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。

数据类型分为值类型和引用类型,基本数据类型就是值类型,存放在栈内存中;引用类型存放在堆内存中

总结:

(1)在JS中数组类型就是引用类型,所以存放在堆之中,就是说数组的地址存放在堆中,而数组的值存放在栈中。一般的数据比如var a=10;此时就会在栈中开辟一个新的空间用于存放a;而var a=[1,2,3,4];此时数组a的地址存放在堆中,而地址指向的值就会在栈中。

JS文件:

function abc(a){
a=100;
}

function abc2(arr){
arr[0]=0;
}

/********************************************************************************************************************/

/* //值传递和引用传递
//1.值传递
var b=0.01;
abc(b);
alert(b);

输出:0.01
//数组是引用类型,传递的是地址
var arr1=[123,2343,435];
abc2(arr1);
for(var i=0;i<arr1.length;i++){
document.writeln(arr1[i]+" ");
}

输出:0 2323 435

(2)注意区分值传递和地址传递的不同