基础的数据类型存放在“栈内存”中,而引用数据类型存放在“堆内存中”。
栈内存
栈内存它是一种静态分配的内存,用于存储基本数据类型和函数调用。在 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、b
和 sum
变量都存储在栈内存中。当函数执行完毕后,这些变量会被自动从栈内存中释放。
堆内存
堆内存是一种动态分配的内存,用于存储对象和复杂数据类型。在 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
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。