0
0
Lập trình
Admin Team
Admin Teamtechmely

Hiểu Rõ Stack và Heap trong JavaScript: Cách Quản Lý Bộ Nhớ Hiệu Quả

Đăng vào 2 ngày trước

• 4 phút đọc

Hiểu Rõ Stack và Heap trong JavaScript: Cách Quản Lý Bộ Nhớ Hiệu Quả

1. Giới Thiệu 🎉

Khi bạn bắt đầu hành trình học lập trình JavaScript, một trong những khái niệm quan trọng mà bạn cần nắm vững là cách ngôn ngữ này quản lý bộ nhớ. Bộ nhớ trong JavaScript được chia thành hai phần chính: StackHeap. Trong bài viết này, chúng ta sẽ cùng nhau khám phá những điều cơ bản về hai khái niệm này, cách thức hoạt động của chúng trong JavaScript và bí quyết sử dụng chúng một cách hiệu quả nhất.

2. Tổng Quan Về Stack và Heap 🔍

2.1 Stack

Stack là một cấu trúc dữ liệu đơn giản, hoạt động theo nguyên tắc LIFO (Last-In-First-Out), tức là phần tử được đưa vào cuối cùng sẽ được lấy ra đầu tiên. Stack chứa các biến cục bộ và tham số của hàm. Khi một hàm được gọi, một khung ngăn xếp (stack frame) mới sẽ được tạo ra để lưu trữ các biến và tham số. Khi hàm kết thúc, khung ngăn xếp này sẽ bị xóa, và các biến bên trong nó cũng sẽ không còn tồn tại.

Ví dụ:

javascript Copy
function multiply(a, b) {
  return a * b;
}

function square(a) {
  return multiply(a, a);
}

let result = square(5);
console.log(result); // Output: 25

Trong đoạn mã trên, khi gọi hàm square(5), Stack sẽ lần lượt thêm các tham số và khung ngăn xếp khi hàm multiply() được gọi.

2.2 Heap

Khác với Stack, Heap là vùng bộ nhớ không theo một cấu trúc xác định, được sử dụng để lưu trữ các đối tượng và giá trị phức tạp khác. Đối với những giá trị động như đối tượng, mảng hay hàm, chúng sẽ được lưu trữ trong Heap, trong khi các biến trong Stack chỉ giữ một tham chiếu tới vị trí của các giá trị này trong Heap.

Ví dụ:

javascript Copy
let person = {
  name: "John Doe",
  age: 30
};

let anotherPerson = person;

Ở ví dụ này, khi chúng ta tạo một đối tượng person, nó sẽ được lưu trữ trong Heap và biến person chỉ giữ một tham chiếu đến vị trí của nó.

2.3 Tương Tác Giữa Stack và Heap

Stack và Heap làm việc cùng nhau để đảm bảo rằng JavaScript có thể quản lý bộ nhớ một cách hiệu quả. Khi bạn gọi hàm, Stack sẽ tạo ra một khung ngăn xếp mới để lưu trữ các tham số. Nếu hàm đó cần sử dụng đối tượng hay giá trị phức tạp, chúng sẽ được lưu trữ trong Heap.

Ví dụ:

javascript Copy
function updatePersonAge(person, newAge) {
  person.age = newAge;
  return person;
}

let john = {
  name: "John Doe",
  age: 30
};

let updatedJohn = updatePersonAge(john, 35);
console.log(updatedJohn); // Output: { name: 'John Doe', age: 35 }
console.log(john); // Output: { name: 'John Doe', age: 35 }

Trong ví dụ này, chúng ta có thể thấy sự thay đổi trong đối tượng john. Điều này xảy ra vì cả johnupdatedJohn đều trỏ tới cùng một đối tượng trong Heap.

3. Quản Lý Bộ Nhớ Hiệu Quả 🔧

3.1 Quản Lý Bộ Nhớ trong Stack

Stack giúp tự động quản lý bộ nhớ cho các biến cục bộ, giúp giải phóng tài nguyên khi hàm kết thúc. Hệ thống sẽ tự động xóa khung ngăn xếp và mọi biến bên trong đó sẽ không còn tồn tại.

3.2 Quản Lý Bộ Nhớ trong Heap

Heap phức tạp hơn và yêu cầu cơ chế Garbage Collection để quản lý bộ nhớ. Garbage Collector tự động giải phóng bộ nhớ cho những đối tượng và giá trị không còn được tham chiếu.

Ví dụ:

javascript Copy
let person = {
  name: "John Doe",
  age: 30
};

person = null; // Giải phóng bộ nhớ cho đối tượng person

Khi person được gán giá trị null, Garbage Collector sẽ nhận ra rằng không còn tham chiếu nào tới đối tượng này và sẽ xóa nó khỏi Heap.

4. Thêm Vài Ví Dụ Cụ Thể Về Stack và Heap 📚

Ví dụ 1: Gán Giá Trị Cho Biến

javascript Copy
let x = 5;
let y = x;
y = 10;
console.log(x); // Output: 5
console.log(y); // Output: 10

Trong ví dụ này, khi x được gán giá trị 5, biến y chỉ nhận giá trị của x, chứ không tham chiếu.

Ví dụ 2: Sử Dụng Đối Tượng

javascript Copy
let person = {
  name: "John Doe",
  age: 30
};

let anotherPerson = person;
anotherPerson.age = 35;

console.log(person.age); // Output: 35
console.log(anotherPerson.age); // Output: 35

Khi thay đổi thuộc tính age của anotherPerson, đối tượng được tham chiếu là giống nhau, dẫn đến việc person cũng phản ánh sự thay đổi đó.

5. Kết Luận 🚀

Hiểu biết về Stack và Heap không chỉ giúp bạn làm chủ cách JavaScript quản lý bộ nhớ mà còn giúp bạn viết mã hiệu quả hơn. Kiến thức này sẽ giảm thiểu nguy cơ gặp phải các vấn đề liên quan đến bộ nhớ, từ đó nâng cao hiệu suất ứng dụng của bạn. Hãy tiếp tục trau dồi và thực hành để củng cố kiến thức của mình!

Nếu bạn có bất kỳ câu hỏi nào hoặc muốn thảo luận thêm về chủ đề này, đừng ngần ngại để lại ý kiến bên dưới bài viết nhé!
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào