基本类型值和引用类型值
基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。
基本数据类型Undefined、 Null、 Boolean、 Number 和 String是按值访问的,因为可以操作保存在变量中的实际的值。
引用类型的值是保存在内存中的对象。当复制保存着对象的某个变量时,操作的是对象的引用。但在为对象添加属性时,操作的是实际的对象。
栈和堆
与基本类型值和引用类型值对应的两种数据结构。
栈是一种先入先出的数据结构,可以通过JavaScript的数组来模拟栈
var arr = []; //创建一个栈
arr.push("apple"); // ["apple"]
arr.push("banana"); // ["apple","banana"]
arr.pop(); // ["apple"]
arr.push("banana"); // ["apple","banana"]
基本类型值就是存储在栈内的简单数据段,即基本类型值存储在变量访问的位置。
堆是存放数据的基于散列算法的数据结构,在JavaScript中,引用值是存放在堆中的。
引用值是存储在堆中的对象,也就是说,存储在变量处的值(即指向对象的变量,存储在栈中)是一个指针,指向存储在堆中的实际对象。
变量num,bol,str为基本数据类型,它们的值,直接存放在栈中,obj,person为复合数据类型,他们的引用变量存储在栈中,指向于存储在堆中的实际对象。
由上图可知,我们无法直接操纵堆中的数据,也就是说我们无法直接操纵对象,但我们可以通过栈中对对象的引用来操作对象。
堆比栈大,栈比堆的运算速度快,对象是一个复杂的结构,并且可以自由扩展,如:数组可以无限扩充,对象可以自由添加属性。将他们放在堆中是为了不影响栈的效率。而是通过引用的方式查找到堆中的实际对象再进行操作。相对于简单数据类型而言,简单数据类型就比较稳定,并且它只占据很小的内存。不将简单数据类型放在堆是因为通过引用到堆中查找实际对象是要花费时间的,而这个综合成本远大于直接从栈中取得实际值的成本。所以简单数据类型的值直接存放在栈中。