JavaScript là ngôn ngữ pass-by-value (truyền tham trị), nhưng cách thức hoạt động khác nhau tùy thuộc vào loại dữ liệu được truyền.
1. Đối với kiểu dữ liệu nguyên thủy (Primitive Types)
Với các kiểu dữ liệu nguyên thủy như number
, string
, boolean
, null
, undefined
, và symbol
, JavaScript pass-by-value. Điều này có nghĩa là khi bạn truyền một biến kiểu nguyên thủy vào một hàm hoặc gán nó cho một biến khác, bản sao của giá trị đó được truyền.
Ví dụ:
let a = 10;
let b = a; // b là một bản sao của a, không phải tham chiếu đến a
b = 20;
console.log(a); // 10, a không bị ảnh hưởng bởi sự thay đổi của b
2. Đối với kiểu dữ liệu phức tạp (Complex Types)
Với các kiểu dữ liệu phức tạp như object
và array
, JavaScript vẫn pass-by-value, nhưng giá trị mà nó truyền là một tham chiếu đến đối tượng trong bộ nhớ. Điều này có nghĩa là nếu bạn thay đổi thuộc tính của đối tượng hoặc mảng trong hàm hoặc biến khác, nó sẽ ảnh hưởng đến đối tượng ban đầu vì cả hai đều tham chiếu đến cùng một địa chỉ bộ nhớ.
Ví dụ:
let obj1 = { name: 'Alice' };
let obj2 = obj1; // obj2 chứa một tham chiếu tới obj1
obj2.name = 'Bob';
console.log(obj1.name); // "Bob", vì obj1 và obj2 cùng tham chiếu đến một đối tượng
Điều này thường gây nhầm lẫn, nhưng kỹ thuật của JavaScript vẫn là pass-by-value – chỉ là giá trị mà nó truyền là một tham chiếu tới địa chỉ của đối tượng trong bộ nhớ chứ không phải đối tượng thực tế.
Tóm tắt:
- Kiểu nguyên thủy: pass-by-value – truyền giá trị trực tiếp.
- Kiểu phức tạp: pass-by-value nhưng giá trị truyền là một tham chiếu đến đối tượng, dẫn đến hành vi giống như pass-by-reference khi làm việc với thuộc tính đối tượng.