2012-09-12 28 views
5

Điều gì đang xảy ra trong mã này?Sử dụng một đối tượng làm khóa thuộc tính trong JavaScript

var a = {a:1}; 
var b = {b:2}; 
var c = {}; 

c[a] = 1; 
c[b] === 1 // true! 

c[b] = 2; 
c[a] === 2 // true! 

Cụ thể, tại sao không sử dụng nhìn lên b trong c trở lại các giá trị đã được lưu trữ trong một tài sản của a?

Điều gì có nghĩa là sử dụng đối tượng làm khóa cho thuộc tính trong JavaScript?

Tôi đã thử nghiệm tính năng này trong Chrome/Node và trong Firefox.

+2

hiện tại javascript không có hỗ trợ cho đối tượng dưới dạng khóa có thể nhận được chuỗi coherse (được chuyển đổi thành chuỗi) sẽ là [object Object] và lưu trữ giá trị do đó nó cho đúng đối tượng làm khóa, nhưng trong tương lai 'là thứ bạn có thể sử dụng để lưu trữ đối tượng dưới dạng khóa. – Sushil

+0

Âm thanh thú vị @Sushil. Bạn có tham khảo thông tin về lớp Bản đồ tương lai tiềm năng này không? Tôi không thể tìm thấy nó được đề cập ở bất cứ nơi nào sau một vài phút tìm kiếm. –

+1

thực hiện tương lai của nó cho ECMAScript 6 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Map đây u đi và bổ sung có một khái niệm WeakMap rất đẹp (cá nhân tôi thích nó) https : //developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/WeakMap tại đây u có thể đọc về nó – Sushil

Trả lời

10

Điều gì có nghĩa là sử dụng đối tượng làm khóa cho thuộc tính trong JavaScript?

Đối tượng Javascript chỉ cho phép khóa chuỗi, vì vậy đối tượng của bạn trước tiên sẽ bị buộc vào chuỗi.

Cụ thể, tại sao sử dụng tìm kiếm b trong c trả lại giá trị được lưu trữ trong thuộc tính của?

Chuỗi đại diện của {a: 1}{b: 2}cả"[object Object]", do đó, bất động sản được ghi đè.

Edit:Nếu bạn thực sự cần phải sử dụng đối tượng như phím (Tôi muốn một giải pháp khác, nếu có thể), bạn có thể sử dụng JSON đại diện của đối tượng:

c[JSON.stringify(a)] = 1 
c[JSON.stringify(b)] = 2 

Nhưng, một lần nữa, hãy thử nghĩ về một cách tiếp cận khác. Có lẽ các đối tượng có số nhận dạng duy nhất khác với chính đối tượng đó.

+1

Chúc mừng Linus, điều này có ý nghĩa tốt. Tôi cần phải sử dụng các đối tượng như các khóa theo nghĩa nào đó, vì vậy một lớp 'Map' thực sự sẽ hữu ích. Tuy nhiên tôi sẽ không có rất nhiều trong tập của tôi, vì vậy tôi nghĩ rằng tôi sẽ chỉ tạo ra một loạt các cặp khóa/giá trị, và trên vòng lặp 'get' thông qua chúng, kiểm tra các khóa bằng '==='. Nó sẽ là O (N), nhưng N của tôi sẽ vào khoảng 10 nên tôi không bực mình. Cảm ơn một lần nữa. –

2

Tại sao bạn sử dụng một đối tượng như một chìa khóa, chìa khóa đang trở thành kết quả của object.toString() đó là [Object Object],

Vì vậy, những gì bạn đang dothing được thiết lập một giá trị cho tài sản "[Object Object]", và nhận được giá trị của tài sản "[Object Object]".

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