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:
1. Gán qua giá trị (Value Assignment)
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.
Các kiểu dữ liệu nguyên thủy bao gồm:
Number
String
Boolean
Null
Undefined
Symbol
BigInt
Ví dụ:
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.
2. Gán qua tham chiếu (Reference Assignment)
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.
Ví dụ:
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.
Tóm tắt
- Gán qua giá trị: Chỉ xảy ra với các kiểu dữ liệu nguyên thủy. Một bản sao của giá trị được tạo ra và lưu trữ trong biến mới. Thay đổi trong biến này không ảnh hưởng đến biến gốc.
- Gán qua tham chiếu: Xảy ra với các kiểu dữ liệu tham chiếu. Cả hai biến tham chiếu đến cùng một vị trí bộ nhớ. Thay đổi một trong các biến sẽ ảnh hưởng đến biến còn lại.
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ả.