2011-06-09 47 views
6

Cuối cùng tôi đã tò mò đủ để tìm hiểu lý do tại sao javascript làm ma thuật voodoo của nó để tìm hiểu lý do tại sao không phải tất cả các tham chiếu đối tượng được tạo ra bằng nhau.Tại sao tính năng này hoạt động? Tham khảo đối tượng trong Javascript

Với ví dụ:

var a, b, c, d; 
a = 100; b = a; 

c = {}; d = c; 

b = 10; d.e = 'f'; 

console.log(a, b); // outputs 100, 10 
console.log(c, d); // outputs object => e = 'f', object => e = 'f' 

Nếu tất cả các biến trong javascript là các đối tượng, sau đó những gì làm cho các trường hợp sử dụng với cd diễn viên một cách rõ ràng như một Object quá khác biệt so với quy định ab như Number? Hoặc, tại sao cd được liên kết với nhau và không phải ab?

Trả lời

8

Tất cả các biến trong JavaScript không phải là đối tượng. Cũng có các kiểu gốc.

cdkhông được liên kết với nhau. Họ đang trỏ đến cùng một tham chiếu đối tượng. Nếu bạn đã chỉ định lại d cho một mục khác, điều đó sẽ không ảnh hưởng đến c.

var c = {}; 
var d = c; 
d = { foo: "bar" }; 

c === d // false 

Tuy nhiên, nếu bạn đã sửa đổi các đối tượng được tham khảo bởi c hoặc d, nó sẽ thay đổi cùng một đối tượng từ cd đều đề cập đến cùng một đối tượng như trong ví dụ của bạn.

+0

Điều đó làm cho một LOT ý nghĩa hơn nhìn thấy nó như thế. Cảm ơn! – buzzedword

3

Có vẻ với tôi rằng sự khác biệt là với b, bạn giao lại các biến để một đối tượng mới/giá trị, trong khi với d, bạn sửa đổi đối tượng hiện.

+0

Vì vậy, những gì bạn đang nói là, điều đó (như Anurag đã chỉ ra) sử dụng kiểu Gốc sẽ tạo một đối tượng 'mới' hoàn toàn, trong khi gán lại đối tượng cho biến khác chỉ cần tham chiếu-- trừ khi Từ khoá 'new' được sử dụng rõ ràng? – buzzedword

+0

Điều này không đúng. Các giá trị được gán cho 'a' và' b' là các đối tượng * not *. – lawnsea

+0

@Buzzedword: Một cái gì đó như thế. – JAB

2

Giá trị của a được gán cho b là số. Giá trị được chỉ định từ c đến d là tham chiếu đến đối tượng.

var a, b, c, d; 
a = 100; // a has value 100, a number 
b = a; // b has value 100, a number 

c = {}; // c has value p, a reference to some object P 
d = c; // d has value p, a reference to P 

b = 10; // b has value 10, a number 
d.e = 'f'; // P.e has value 'f', a string 
Các vấn đề liên quan