Code前端首页关于Code前端联系我们

JavaScript——堆栈内存

terry 2年前 (2023-09-10) 阅读数 84 #前端教程

基础的数据类型存放在“栈内存”中,而引用数据类型存放在“堆内存中”。

栈内存

栈内存它是一种静态分配的内存,用于存储基本数据类型和函数调用。在 JavaScript 中,所有的基本数据类型都存储在栈内存中。当我们声明一个变量时,JavaScript 会在栈内存中为其分配一块内存空间,并将变量的值存储在这个内存空间中。

函数调用时,JavaScript 会将函数的参数和局部变量存储在栈内存中。当函数执行完毕后,这些变量会被自动从栈内存中释放。

栈内存的大小是有限的,当栈内存空间不足时,JavaScript 会抛出“栈溢出”错误。

例如:
栈内存:分配空间固定,并且是不可变的,而且保存的是堆内存的地址
堆内存:分配的空间不是固定的,且空间大小可变。
栈内存保存的堆内存地址可以通过地址找到堆空间。
例如:

function add(a, b) {
  let sum = a + b; 
  return sum;
}
let result = add(2, 3); 
result console.log(result); // 输出5

这里定义了一个 add 函数,该函数将两个数字相加并返回结果。然后,我们调用 add 函数,并将结果赋值给 result 变量。在函数调用期间,a、bsum 变量都存储在栈内存中。当函数执行完毕后,这些变量会被自动从栈内存中释放。

堆内存

堆内存是一种动态分配的内存,用于存储对象和复杂数据类型。在 JavaScript 中,所有的对象都存储在堆内存中。当我们创建一个对象时,JavaScript 会在堆内存中为其分配一块内存空间,并将对象的属性和方法存储在这个内存空间中。

堆内存的分配和释放是由 JavaScript 的垃圾回收机制来管理的。当一个对象不再被引用时,垃圾回收机制会自动将其从堆内存中释放,以便其他对象可以使用这些内存空间。
例如:

let obj1 = { name: "John", age: 30 }; 
let obj2 = obj1; 
console.log(obj2); // 输出{name: "John", age: 30}

在这个例子中创建了一个对象 obj1,并将其赋值给 obj2。然后,我们将 obj1 设置为 null,但是 obj2 仍然可以访问原始的对象。这是因为在 JavaScript 中,对象是通过引用来传递的,而不是通过值来传递的。

堆内存和栈内存的区别

堆内存和栈内存他俩最大区别在于它们的分配和释放方式。
堆内存是动态分配的,由垃圾回收机制来管理,而栈内存是静态分配的,由 JavaScript 引擎来管理

另外,堆内存主要用于存储对象和复杂数据类型,而栈内存是用于存储基本数据类型和函数调用。
由于堆内存的这个分配和释放是由垃圾回收机制来管理的,所以堆内存的分配和释放速度相对较慢,而栈内存的分配和释放速度相对较快。

总结

堆内存和栈内存是两种不同的内存类型,用于存储不同类型的数据。堆内存用于存储对象和复杂数据类型,而栈内存用于存储基本数据类型和函数调用。

原文链接:https://www.codeqd.com/zb_users/upload/2023/09/7245583330240905273 作者:SouthernWind

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门