Trong JavaScript, việc gán giá trị cho biến có thể diễn ra theo hai cách: gán qua giá trị và gán qua tham chiếu. Sự khác biệt này chủ yếu phụ thuộc vào loại dữ liệu mà biến đó chứa. Dưới đây là giải thích chi tiết về hai khái niệm này:
Khi bạn gán một biến với một kiểu dữ liệu nguyên thủy (primitive type), giá trị của biến được lưu trữ trực tiếp trong bộ nhớ. Nếu bạn tạo một biến mới và gán nó bằng biến cũ, một bản sao của giá trị sẽ được tạo ra.
NumberStringBooleanNullUndefinedSymbolBigIntlet a = 10; // Gán giá trị 10 cho biến a let b = a; // Gán giá trị của a cho b, bây giờ b cũng có giá trị 10 a = 20; // Thay đổi giá trị của a console.log(a); // In ra 20 console.log(b); // In ra 10, b không bị ảnh hưởng
Trong ví dụ trên, biến b nhận một bản sao của giá trị của a. Khi giá trị của a thay đổi, giá trị của b không bị thay đổi.
Khi bạn gán một biến với một kiểu dữ liệu tham chiếu (reference type), như đối tượng (Object), mảng (Array), hoặc hàm (Function), biến không chứa giá trị mà chứa một tham chiếu đến vị trí bộ nhớ nơi giá trị được lưu trữ. Nếu bạn gán một biến này cho một biến khác, cả hai biến sẽ tham chiếu đến cùng một đối tượng.
let obj1 = { name: 'Alice' }; // Tạo một đối tượng và gán cho obj1
let obj2 = obj1; // Gán obj1 cho obj2, bây giờ cả hai đều tham chiếu đến cùng một đối tượng
obj2.name = 'Bob'; // Thay đổi thuộc tính name của obj2
console.log(obj1.name); // In ra 'Bob', obj1 cũng bị ảnh hưởng
Trong ví dụ trên, cả obj1 và obj2 đều tham chiếu đến cùng một đối tượng trong bộ nhớ. Khi bạn thay đổi thuộc tính name của obj2, nó cũng ảnh hưởng đến obj1 vì chúng đều tham chiếu đến cùng một đối tượng.
Sự khác biệt này rất quan trọng trong JavaScript, giúp bạn hiểu cách các biến tương tác với nhau và quản lý bộ nhớ một cách hiệu quả.