js中变量分为两种类型基本数据类型和引用类型">JS中变量分为两种类型:基本数据类型和引用类型
(一)基本数据类型:Undefined,Null,Boolean,Number和String
(二)引用类型:对象,数组,函数
原始值和引用值存储在内存中的位置分别是栈和堆。原始值是存储在栈中的简单数据段,他们的值直接存储在变量访问的位置。引用值是存储在堆中的对象。
栈:
主要表现为一种数据结构,是只能在某一端插入和删除的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读取数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一段成为栈顶,另一端称为栈底;栈底固定,而栈顶浮动 ;栈中元素个数为零时,称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。
图谱解释:
存储在栈中的值是一个指针,指向存储在堆中的实际对象
关于基本变量的交换,按值访问操作的是他们实际保存的值;
js javascript"> js-function">js-keyword">function js-title">qkjs-params">()
{
js-keyword">var store1 = js-string">"China";
js-keyword">var store2 = store2;
store1 = js-string">"USA";
alert(store2);js-comment">//China
}
qk();
将基本类型store1传递给另一个变量(赋值)时,其实是分配了一块新的内存空间,因此改变了store1的值对store2没有任何影响。
堆:
在程序中,堆用于动态分配和释放程序所使用的对象。在以下情况中调用堆操作:
1.事先不知道程序所需对象的数量和大小。
2.对象太大,不适合使用堆栈分配器。
堆使用运行期间分配给代码和堆栈以外的部分内存。
在javascript中,引用数据是放在堆中的,例如数组和对象,因为在javascript中,一切都是对象,对象可以进行扩展,放置在堆中可以进行不断的扩展,如果放在内存中就会消耗大量资源。放置在堆中的数据的查询效率比较低。这也是内存优于堆的好处,但是内存的存储空间要比堆的小很多。
按引用访问,当查询时,需要先从栈中读取内存地址,然后再顺藤摸瓜找到保存在堆内存中的值
var obj1 = new Object();
obj1.name = "obji name";
console.log(obj1.name);//输出obj1 name
var obj2 = obj1;
console.log(obj2.name);//输出obj1 name
obj1.name = "qk";
console.log(obj2.name);//qk
栈的优势就是存取速度比堆要快,仅次于直接位于CPU中的寄存器,但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,垃圾收集器会自动地收走这些不再使用的数据,但是缺点是由于在运行时动态分配内存,所以存取速度较慢。
所以相对于简单数据类型而言,他们占用内存比较小,如果放在堆中,查找会浪费很多时间,而把堆中的数据放入栈中也会影响栈的效率。比如对象和数组是可以无限拓展的,正好放在可以动态分配大小的堆中。