Hiểu về stack và head trong javascript

Trong lập trình và bộ nhớ máy tính, StackHeap là hai khu vực chính trong RAM được sử dụng để lưu trữ dữ liệu khi một chương trình chạy. Dưới đây là giải thích chi tiết:

1. Stack (Ngăn xếp)

  • Mục đích: Lưu trữ dữ liệu tạm thời như biến cục bộ, tham số hàm, và địa chỉ trả về của hàm.
  • Cách hoạt động: Stack hoạt động theo cơ chế LIFO (Last In, First Out) – dữ liệu vào sau sẽ ra trước.
  • Đặc điểm:
    • Tốc độ nhanh: Do hoạt động theo cấu trúc ngăn xếp nên việc thêm/xóa dữ liệu rất nhanh.
    • Kích thước cố định: Bộ nhớ stack có kích thước cố định, được xác định khi chương trình khởi chạy.
    • Phạm vi ngắn hạn: Dữ liệu trong stack bị xóa ngay khi hàm kết thúc hoặc khi biến ra khỏi phạm vi sử dụng.
    • Ví dụ:
function add(a, b) {  
  let sum = a + b; // 'sum' được lưu trên stack  
  return sum;  
}  
add(3, 5);  

Trong ví dụ trên:

  • Các tham số ab, cùng với biến sum, được lưu trong stack.
  • Khi hàm kết thúc, bộ nhớ này được giải phóng.

2. Heap (Đống)

  • Mục đích: Lưu trữ dữ liệu lớn hoặc dữ liệu có tuổi thọ dài hơn, chẳng hạn như đối tượng và mảng.
  • Cách hoạt động: Heap là một khu vực bộ nhớ lớn và không có cấu trúc cố định, cho phép lưu trữ và truy cập dữ liệu động.
  • Đặc điểm:
    • Kích thước linh hoạt: Bộ nhớ heap có thể mở rộng nếu cần thêm không gian (dựa trên bộ nhớ vật lý).
    • Chậm hơn stack: Do dữ liệu được truy cập thông qua con trỏ và cần thêm thời gian quản lý.
    • Dữ liệu tồn tại lâu dài: Bộ nhớ trong heap không bị tự động giải phóng; lập trình viên cần quản lý (hoặc trình dọn rác – Garbage Collector sẽ thực hiện).
    • Ví dụ:
let obj = { name: 'John', age: 30 }; // Đối tượng này lưu trên heap  
let arr = [1, 2, 3]; // Mảng này cũng lưu trên heap  

Trong ví dụ trên:

  • objarr được lưu trong heap, nhưng tham chiếu (con trỏ) của chúng được lưu trong stack.

So sánh Stack và Heap

Đặc điểmStackHeap
Quản lýTự động (xóa sau khi phạm vi kết thúc)Thủ công hoặc nhờ Garbage Collector
Tốc độNhanhChậm hơn do cần tìm kiếm và quản lý
Cấu trúcCó tổ chức (LIFO)Không có cấu trúc cố định
Kích thướcCố địnhLinh hoạt
Dữ liệu lưu trữBiến cục bộ, tham số hàmĐối tượng, mảng, dữ liệu động

Tóm tắt:

  • Stack: Dùng cho dữ liệu ngắn hạn, truy cập nhanh, có giới hạn kích thước.
  • Heap: Dùng cho dữ liệu lớn hoặc tồn tại lâu dài, linh hoạt nhưng chậm hơn.

Bạn có thể hình dung:

  • Stack giống như một ngăn kệ nhỏ, nhanh chóng để lưu trữ và truy cập.
  • Heap giống như một kho hàng lớn, linh hoạt nhưng mất thời gian để tìm đồ và quản lý.