2012-09-12 22 views
5

¿Qué está pasando en este código?Usar un objeto como clave de propiedad en 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! 

Específicamente, ¿por qué no usar mirando hacia arriba en bc retorno el valor que se almacena en una propiedad de a?

¿Qué significa utilizar un objeto como clave de una propiedad en JavaScript?

He probado esto en Chrome/Node y en Firefox.

+2

actualmente javascript no tiene soporte para object como clave, probablemente obtenga coherse (convertido a) string que será [object Object] y almacenará el valor, por lo que da verdadero a cada objeto como clave, pero en el futuro 'Map 'es algo que puedes usar para almacenar objetos como una clave. – Sushil

+0

Suena interesante @Sushil. ¿Tiene alguna referencia a la información sobre esta futura clase de Map? No pude encontrarlo mencionado en ningún lado después de unos minutos de búsqueda. –

+1

es una implementación futura para ECMAScript 6 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Map aquí va y, además, hay un concepto WeakMap muy agradable (me gusta personalmente) https : //developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/WeakMap aquí puede leer al respecto – Sushil

Respuesta

10

¿Qué significa utilizar un objeto como clave de una propiedad en JavaScript?

Los objetos Javascript solo permiten claves de cadena, por lo que su objeto será forzado a una cadena.

Específicamente, ¿por qué el uso de buscar b en c devuelve el valor almacenado en una propiedad de a?

La representación de cadena de {a: 1} y {b: 2} son tanto"[object Object]", por lo tanto, la propiedad se sobrescribe.

Editar:Si que realmente necesita para utilizar objetos como claves (yo preferiría otra solución, si es posible), se puede usar JSON representación del objeto:

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

Pero, de nuevo, trato pensar en un enfoque diferente. Quizás los objetos tienen identificadores únicos además del objeto en sí.

+1

Cheers Linus, esto tiene sentido. Necesito usar objetos como claves en cierto sentido, por lo que una clase real de 'Mapa' sería útil. Sin embargo, no tendré muchos en mi set, así que creo que crearé una matriz de pares clave/valor y en el bucle 'get', probando las teclas con '==='. Será O (N), pero mi N será alrededor de 10, así que no estoy molesto. Gracias de nuevo. –

2

¿Por qué se utiliza un objeto como una clave, la clave está convirtiendo en consecuencia 's la object.toString() que es [Object Object],

Así que lo que está dothing se fija un valor a la propiedad "[Object Object]", y obtener el valor de la propiedad "[Object Object]".

Cuestiones relacionadas