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.
Number
String
Boolean
Null
Undefined
Symbol
BigInt
let 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ả.