js中栈和堆的区别

64次阅读
没有评论

在 JavaScript 中,栈和堆是两种不同的数据结构,用于存储变量和对象的值。

栈是一种线性数据结构,可以理解为一种特殊的数组。它是按照先进先出(FILO)的顺序管理内存的,也就是说最后进入栈的变量会最先被取出。栈内存中存储的是基本数据类型的值(如字符串、数字、布尔值等)以及对象的引用。在 JavaScript 中,每当函数被调用时,就会创建一个新的栈帧(stack frame)并将其推入调用栈中。当函数执行完毕后,它的栈帧将从调用栈中弹出,并销毁其中的变量和对象。

堆是一种非线性数据结构,用于存储引用类型的值,例如对象、数组、函数等。堆内存中存储的是对象的实际值,也就是对象本身,而栈中存储的是对于这些对象的引用。在 JavaScript 中,当我们声明一个对象时,实际上是在堆内存中创建了一个对象,然后将其地址保存在栈中。这个地址指向的是实际的对象,而不是对象的副本。因此,多个变量可以引用同一个对象,它们都指向同一个堆内存地址。

下面是一个例子,演示栈和堆之间的区别:

// 栈内存中存储的是基本数据类型的值
let a = 10;
let b = a;

a = 20;

console.log(a); // 20
console.log(b); // 10

// 堆内存中存储的是对象的引用
let obj1 = { name: 'Alice' };
let obj2 = obj1;

obj1.name = 'Bob';

console.log(obj1.name); // 'Bob'
console.log(obj2.name); // 'Bob'

在上面的例子中,我们创建了一个整数变量 a,并将其值赋给变量 b。然后我们将 a 的值修改为 20,但是这不会影响变量 b 的值。这是因为在栈内存中存储的是基本数据类型的值,而这些值是被复制的,而不是被引用的。

我们还创建了两个对象 obj1 和 obj2,并将 obj1 的引用赋给 obj2。然后我们修改了 obj1 的属性 name,这也会影响到 obj2 的属性 name。这是因为在堆内存中存储的是对象的实际值,而栈中存储的是对于这些对象的引用。因此,多个变量可以引用同一个对象,它们都指向同一个堆内存地址。

正文完
 
评论(没有评论)