JS中对象分为基本类型和引用类型,基本类型存放在栈内存,引用类型存放在堆内存。请问栈内存和堆内存的区别是什么,为什么这两种对象分别存储在不同的内存中?
这很好理解,比如说这么个函数:
function sum(i)
{
if (i == 1) return 1;
return i + sum(i - 1);
}
显然,这是一个递归函数,函数自己调用自己。
那么每个调用,都必须保存一个i的变量。
此时就要用堆栈。堆栈的栈顶始终保持着函数的局部变量。当函数返回,则往回收缩,这多方便。
而堆呢?适合全局的、一般的存储。
栈会在生命期自动分配,回收。速度更快。
堆空间更大。由用户控制。通过引用计数来控制生命期
回收器来释放最终的堆空间
基本类型一般数据都小。所以用栈,速度快
引用类型有计数,有堆来控制释放机制
没错,基本类型如果是全局的,也放在堆上。
而且,位于引用类型内的基本类型,也是放在堆上。
其实究其根本,所谓引用类型,还是由基本类型构成的,比如一个对象的每个字段,还是简单类型。或者一个数组,它的一个元素还是基本类型。
或者不是基本类型,但是它内部再细分,最后都是基本类型。