Trong JavaScript, tất cả các đối tượng được lưu trữ và chuyển 'bằng tham chiếu'.
var a = { v: 'a' }, b = { v: 'b' };
a=b;
b.v='c';
a
và b
sẽ tham chiếu cùng một đối tượng; a.v == 'c'
và b.v == 'c'
.
kiểu dữ liệu nguyên thủy (string
, number
, boolean
, null
, và undefined
) là không thay đổi; chúng được truyền theo giá trị.
var a = 'a', b = 'b';
a=b;
b='c';
Kể từ khi chúng tôi đang làm việc với nguyên thủy, a == 'b'
và b == 'c'
.
pedants sẽ cho bạn biết rằng JavaScript được không pass-by-reference trong một cảm giác cổ điển, hoặc rằng đó là một "tinh khiết pass-by-value" ngôn ngữ, nhưng tôi nghĩ rằng những điều phức tạp cho các mục đích thực tế. Không, bạn không thể trực tiếp sửa đổi một đối số được chuyển đến một hàm như thể nó là một biến (điều này đúng nếu ngôn ngữ là đúng tham chiếu), nhưng bạn cũng không nhận được copy của một đối tượng được truyền dưới dạng một đối số (như bạn sẽ làm nếu nó là giá trị theo giá trị thực). Đối với hầu hết các mục đích (từ quan điểm của người dùng ngôn ngữ, bạn), các đối tượng được truyền cho một hàm là các tham chiếu, vì bạn có thể sửa đổi đối tượng đó và nó ảnh hưởng đến đối tượng của người gọi. Xem thêm fantastic answers to this question.
Phụ thuộc vào phương pháp sao chép của bạn. Bạn phải cụ thể - làm thế nào để bạn sao chép các giá trị của bạn? –
Hay bạn có nghĩa là trường hợp khi một giá trị được chuyển như một đối số vào một hàm? –
Thay vì được truyền qua các đối số, tôi đang nghĩ về một 'var x, y đơn giản; x = {'blah': 'foo'}; y = x; x = {'bar': 'bas'}; console.log (y); 'loại tình huống, nhưng nếu có nhiều sắc thái đối với các loại sao chép hơn xin vui lòng cho tôi biết cách tôi có thể cải thiện câu hỏi. – buley