Bất cứ khi nào bạn trả lại đối tượng, bạn sẽ trả về tham chiếu đến đối tượng. Tương tự như vậy, khi bạn đang truyền một đối tượng, bạn đang truyền tham chiếu. Tuy nhiên, việc chuyển đối tượng vào làm đối số có thể khác với việc thay đổi đối tượng trong phạm vi toàn cục, như các ví dụ này hiển thị. Điều này là do tham chiếu đến đối tượng được tự nó truyền theo giá trị.
Nếu bạn đang thay đổi các thành viên của một đối tượng, sau đó cho dù bạn chuyển nó thành một đối số hay chỉ cập nhật đối tượng chung thì không có sự khác biệt. Dù bằng cách nào, bạn đang làm việc với cùng một đối tượng.
Ví dụ 1:
var object = {foo:'original'};
function changeObject() {
object.foo = 'changed';
return object;
}
console.log(changeObject()); // outputs {foo:'changed'}
console.log(object); // outputs {foo:'changed'}
Ví dụ 2:
var object = {foo:'original'};
function changeArgument(object) {
object.foo = 'changed';
return object;
}
console.log(changeArgument(object)); // outputs {foo:'changed'}
console.log(object); // outputs {foo:'changed'}
Mặt khác, nếu bạn đang ghi đè lên các đối tượng với một đối tượng mới, sự thay đổi sẽ không tồn tại nếu bạn làm nó vào đối số, nhưng sẽ tồn tại nếu bạn làm điều đó với đối tượng chung. Đó là bởi vì đối số chuyển tham chiếu đến đối tượng theo giá trị.Một khi bạn thay thế giá trị này với một tham chiếu đến một đối tượng mới, bạn không nói về cùng một đối tượng nữa.
Ví dụ 3:
var object = {foo:'original'};
function replaceObject() {
object = {foo:'changed'};
return object;
}
console.log(replaceObject()); // outputs {foo:'changed'}
console.log(object); // outputs {foo:'changed'}
Ví dụ 4:
var object = {foo:'original'};
function replaceArgument(object) {
object = {foo:'changed'};
return object;
}
console.log(replaceArgument(object)); // outputs {foo:'changed'}
console.log(object); // outputs {foo:'original'}
Nguồn
2013-02-21 16:03:33
Đối tượng không bao giờ được sao chép, chỉ khi bạn làm như vậy một cách rõ ràng. –
Thay vì nói "các đối tượng được truyền vào các hàm theo tham chiếu", chính xác hơn để nói rằng tham chiếu * đối tượng được truyền theo giá trị. Xem tại đây: http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language/5314911#5314911 –