javascript的堆栈原理

版权声明:本文为原创文章,未经博主允许不得转载,欢迎各种交流,共同进步。 https://blog.csdn.net/sinat_15951543/article/details/79228675

首先说明一下Javascript的堆栈概念

堆&栈


两者都是存放临时数据的地方。
栈是先进后出的,就像一个桶,后进去的先出来,它下面本来有的东西要等其他出来之后才能出来。
堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。对于堆,我们可以随心所欲的进行增加变量和删除变量,不用遵循次序。
栈区(stack) 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。 
堆区(heap) 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。 
堆(数据结构):堆可以被看成是一棵树,如:堆排序; 
栈(数据结构):一种先进后出的数据结构。

数据类型访问&&复制


基本数据类型:基本数据类型值指保存在栈内存中的简单数据段。访问方式是按值访问。

var a = 1;


操作的是变量实际保存的值。

a = 2 ;


基本类型变量的复制:从一个变量向一个变量复制时,会在栈中创建一个新值,然后把值复制到为新变量分配的位置上。

var b = a;


b = 2 ;


引用数据类型:引用数据类型值指保存在堆内存中的对象。也就是,变量中保存的实际上的只是一个指针,这个指针指向内存中的另一个位置,该位置保存着对象。访问方式是按引用访问。

var a = new Object ();


当操作时,需要先从栈中读取内存地址,然后再延指针找到保存在堆内存中的值再操作。

a. name = 'xz' ;


引用类型变量的复制:复制的是存储在栈中的指针,将指针复制到栈中未新变量分配的空间中,而这个指针副本和原指针指向存储在堆中的同一个对象;复制操作结束后,两个变量实际上将引用同一个对象。因此,在使用时,改变其中的一个变量的值,将影响另一个变量。

var b = a;


b.sex = 'boy' ;


漏画了,差一条指针。b的引用指针也指向 object{sex:'boy'}
b.sex; // 'boy' a.name; // 'boy'


猜你喜欢

转载自blog.csdn.net/sinat_15951543/article/details/79228675
今日推荐