JavaScript là pass-by-value (truyền theo giá trị). Nhưng với object, **giá trị chính là reference (tham chiếu)**.
Primitive (number, string, boolean...)
let i = 0;
function increment(x) { x = x + 1; console.log(x); }
increment(i); // 1
console.log(i); // 0 (nguyên vẹn)
→ Giá trị primitive được copy, thay đổi local không ảnh hưởng caller.
Object
let obj = { foo: 'bar' };
function updateRef(x) { x = {}; } // gán lại reference local
function addHelloWorld(y) { y.hello = 'world'; } // mutate object
console.log(obj); // { foo: 'bar' }
updateRef(obj);
console.log(obj); // { foo: 'bar' } (không đổi)
addHelloWorld(obj);
console.log(obj); // { foo: 'bar', hello: 'world' } (đã mutate)
Tóm tắt
- Gán lại tham số (
x = {}) → **không ảnh hưởng** object gốc. - Mutate nội dung (
y.prop = val) → **ảnh hưởng** object gốc (vì cùng reference).
Đây gọi là Call by Sharing (Barbara Liskov).