Javascript là một ngôn ngữ truyền qua giá trị. Nhưng đối với các đối tượng, giá trị là tham chiếu của chúng. Vì vậy, ví dụ:nếu bạn truyền một int cho một hàm dưới dạng tham số và tăng giá trị của nó trong hàm, giá trị của nó sẽ không được cập nhật trong ngữ cảnh của người gọi -
Ví dụ
let i = 0; function increment(x) { x = x + 1 console.log(x) } increment(i) console.log(i)
Đầu ra
1 0
Khi bạn truyền một đối tượng và cập nhật tham chiếu của đối tượng đó trong ngữ cảnh của hàm, điều đó sẽ không ảnh hưởng đến đối tượng. Nhưng nếu bạn thay đổi nội dung bên trong của đối tượng, điều đó sẽ phản ánh trong đối tượng.
Ví dụ
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)
Đầu ra
{ foo: 'bar' } { foo: 'bar' } { foo: 'bar', hello: 'world' }
Lưu ý rằng thay đổi tham chiếu đối tượng không ảnh hưởng đến đối tượng. Biến cục bộ x đã được gán lại. Tuy nhiên, trong hàm thứ hai, y đang tham chiếu đến đối tượng obj và thay đổi trạng thái bên trong của đối tượng đó. Điều này gây ra thay đổi trong đối tượng ban đầu.