ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值。基本类型值指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置。而引用类型值则是指那些保存在堆内存中的对象。
在将一个值赋给变量时,解析器必须确定这个值是基本类型值,还是引用类型值。Undefined、Null、Boolean、Number 和 String这5种基本数据类型的值在内存中占有固定大小的空间,因此可以把它们的值保存在栈内存中。而且,这样也可以提高查询变量的速度。对于保存基本类型值的变量,我们说它们是按值访问的,因为我们操作的是它们实际保存的值。
如果赋给变量的是一个引用类型的值,则必须在堆内存中为这个值分配空间。由于这种值的大小不固定,因此不能把它们保存到栈内存中。但内存地址的大小是固定的,因此可将内存地址保存在栈内存中。这样,当查询引用类型的变量时,就可以首先从栈中读取内存地址,然后再“顺藤摸瓜”地找到保存在堆中的值。对于这种查询变量的方式,我们把它叫做按引用访问,因此我们操作的不是实际的值,而是被那个值引用的对象。