2011-12-28 39 views

Trả lời

100

Tùy thuộc vào những gì bạn đang đẩy. Các đối tượng và mảng được đẩy như một con trỏ đến đối tượng gốc. Các kiểu nguyên thủy được tích hợp sẵn như số hoặc boolean được đẩy dưới dạng bản sao. Vì vậy, vì các đối tượng không được sao chép theo bất kỳ cách nào, không có bản sao sâu hoặc nông cho chúng.

Dưới đây là một đoạn làm việc cho thấy nó:

var array = []; 
 
var x = 4; 
 
var y = {name: "test", type: "data", data: "2-27-2009"}; 
 

 
// primitive value pushes a copy of the value 4 
 
array.push(x);    // push value of 4 
 
x = 5;      // change x to 5 
 
console.log(array[0]);  // array still contains 4 because it's a copy 
 

 
// object reference pushes a reference 
 
array.push(y);    // put object y reference into the array 
 
y.name = "foo";    // change y.name property 
 
console.log(array[1].name); // logs changed value "foo" because it's a reference

30

jfriend00 là đúng vào dấu ở đây, nhưng một rõ nhỏ: Điều đó không có nghĩa là bạn không thể thay đổi những gì bạn biến được trỏ đến. Đó là, y ban đầu tài liệu tham khảo một số biến mà bạn đưa vào mảng, nhưng sau đó bạn có thể lấy biến có tên y, ngắt kết nối nó từ đối tượng đó là trong mảng bây giờ, và kết nối y (ví dụ, làm cho nó tham khảo) một cái gì đó khác hoàn toàn mà không thay đổi đối tượng mà bây giờ chỉ được tham chiếu bởi mảng.

http://jsfiddle.net/rufwork/5cNQr/6/

var array = []; 
var x = 4; 
var y = {name: "test", type: "data", data: "2-27-2009"}; 

// 1.) pushes a copy 
array.push(x); 
x = 5; 
document.write(array[0] + "<br>"); // alerts 4 because it's a copy 

// 2.) pushes a reference 
array.push(y); 
y.name = "foo"; 

// 3.) Disconnects y and points it at a new object 
y = {}; 
y.name = 'bar'; 
document.write(array[1].name + ' :: ' + y.name + "<br>"); 
// alerts "foo :: bar" because y was a reference, but then 
// the reference was moved to a new object while the 
// reference in the array stayed the same (referencing the 
// original object) 

// 4.) Uses y's original reference, stored in the array, 
// to access the old object. 
array[1].name = 'foobar'; 
document.write(array[1].name + "<br>"); 
// alerts "foobar" because you used the array to point to 
// the object that was initially in y. 
+0

điểm thú vị về sử dụng 'new' để "ngắt kết nối" các tham chiếu đối tượng. –

+1

Giải thích downvote? Khó khắc phục sự cố nếu bạn không cho tôi biết đó là gì. – ruffin

+0

Tại sao lại ping tôi? Tôi upvoted này một thời gian dài trước đây và đã làm như câu trả lời của bạn. Dưới đây là một màn hình bỏ phiếu: http://i.imgur.com/AnDt98c.png –

Các vấn đề liên quan