JavaScript เป็นภาษา pass by value แต่สำหรับออบเจ็กต์ ค่าคือ reference ของมัน ดังนั้นเช่น ถ้าส่ง int ไปฟังก์ชันเป็น parameter และเพิ่มค่าในฟังก์ชัน ค่าใน caller's context จะไม่เปลี่ยน
ตัวอย่าง
let i = 0; function increment(x) { x = x + 1 console.log(x) } increment(i) console.log(i)ผลลัพธ์
1 0
เมื่อส่งออบเจ็กต์และอัปเดต reference ของมันในฟังก์ชัน จะไม่ส่งผลต่อออบเจ็กต์ แต่ถ้า mutate internal ของออบเจ็กต์ จะสะท้อนกลับไปที่ออบเจ็กต์เดิม
ตัวอย่าง
let obj = {'foo': 'bar'}; function updateRef(x) { // x's local ref gets updates, doesn't affect obj x = {} } function addHelloWorld(y) { // Add new prop to object referenced by y y['hello'] = 'world'; } console.log(obj) updateRef(obj) console.log(obj) addHelloWorld(obj) console.log(obj)ผลลัพธ์
{ foo: 'bar' } { foo: 'bar' } { foo: 'bar', hello: 'world' }สังเกตว่าการเปลี่ยน reference ของออบเจ็กต์ไม่ส่งผลต่อออบเจ็กต์ ตัวแปร x ถูก reassign ในฟังก์ชันที่สอง y อ้างอิง obj เดียวกันและ mutate internal state ทำให้ออบเจ็กต์เดิมเปลี่ยน