2012-09-12 18 views
5

Cosa succede in questo codice?Utilizzo di un oggetto come chiave di proprietà in 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! 

In particolare, il motivo per cui non utilizzando guardando b nel c cambio il valore che è stato memorizzato in una proprietà di a?

Che cosa significa utilizzare un oggetto come chiave per una proprietà in JavaScript?

Ho provato questo in Chrome/Node e in Firefox.

+2

attualmente javascript non hanno il supporto per oggetto come una chiave probabilmente ottenere coherse (convertito) stringa, che sarà [object Object] e memorizzare il valore da cui si dà la vera ad ogni oggetto come una chiave, ma in futuro 'Mappa 'è qualcosa che puoi usare per memorizzare l'oggetto come chiave. – Sushil

+0

Sembra interessante @Sushil. Hai un riferimento alle informazioni su questa potenziale futura classe Map? Non riuscivo a trovarlo menzionato da nessuna parte dopo alcuni minuti di ricerca. –

+1

la sua una futura implementazione di ECMAScript 6 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Map qui u andare e inoltre c'è un concetto WeakMap molto bello (io personalmente piace) https : //developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/WeakMap qui u può leggere su di esso – Sushil

risposta

10

Che cosa significa utilizzare un oggetto come chiave per una proprietà in JavaScript?

Javascript solo gli oggetti permettono chiavi stringa, così il vostro oggetto in primo luogo essere costretti in una stringa.

In particolare, perché utilizzando la ricerca b in c restituisce il valore memorizzato in una proprietà di a?

La rappresentazione della stringa di {a: 1} e {b: 2} sono entrambi"[object Object]", quindi, la proprietà viene sovrascritto.

Edit:Se si ha realmente bisogno di utilizzare gli oggetti come chiavi (io preferirei un'altra soluzione, se possibile), è possibile utilizzare la rappresentazione JSON dell'oggetto:

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

Ma, ancora una volta, provo pensare ad un approccio diverso. Forse gli oggetti hanno identificatori univoci diversi dall'oggetto stesso.

+1

Acclamazioni Linus, questo fa buon senso. Ho bisogno di usare gli oggetti come chiavi in ​​un certo senso, quindi una classe 'Map' effettiva sarebbe utile. Tuttavia non ne avrò molti nel mio set, quindi penso che creerò solo una serie di coppie chiave/valore, e su "get" il ciclo, testando le chiavi con '==='. Sarà O (N), ma il mio N sarà intorno alle 10 quindi non mi preoccupo. Grazie ancora. –

2

Perché si utilizza un oggetto come una chiave, la chiave sta diventando risultato object.toString() s', che è [Object Object],

Quindi ciò che state dothing è impostato un valore alla proprietà "[Object Object]", e ottenere il valore la proprietà "[Object Object]".

Problemi correlati