Necesito hacer un experimento y necesito saber algún tipo de identificador único para objetos en javascript, para poder ver si son iguales. No quiero usar operadores de igualdad, necesito algo como la función id () en Python.
Existe algo como esto ?
javascript
Stefano Borini
fuente
fuente
Respuestas:
Actualización Mi respuesta original a continuación fue escrita hace 6 años en un estilo acorde con los tiempos y mi comprensión. En respuesta a alguna conversación en los comentarios, un enfoque más moderno para esto es el siguiente:
Si tiene requisitos de navegador arcaicos, verifique aquí la compatibilidad del navegador para
Object.defineProperty
.La respuesta original se mantiene a continuación (en lugar de solo en el historial de cambios) porque creo que la comparación es valiosa.
Puedes darle una vuelta a lo siguiente. Esto también le da la opción de establecer explícitamente el ID de un objeto en su constructor o en otro lugar.
Tenga cuidado de asegurarse de que cualquier miembro que utilice para almacenar internamente la ID única no choque con otro nombre de miembro creado automáticamente.
fuente
object.hasOwnProperty(member)
cuando se usa unfor..in
bucle. Esta es una práctica bien documentada y aplicada por jslintdefineProperty(…, {enumerable:false})
. Y eluid
método en sí debería estar en elObject
espacio de nombres de todos modos4
¿cómo asignarías obj con la identificación 4 a una variable para que puedas hacer cosas con ella ... como acceder a sus propiedades?En lo que respecta a mi observación, cualquier respuesta publicada aquí puede tener efectos secundarios inesperados.
En un entorno compatible con ES2015, puede evitar cualquier efecto secundario utilizando WeakMap .
fuente
return currentId
?WeakMap
diferencia deMap
? Esa función se bloqueará si le proporciona una cadena o un número.Los navegadores más recientes proporcionan un método más limpio para extender Object.prototype. Este código hará que la propiedad esté oculta de la enumeración de propiedades (para p en o)
Para los navegadores que implementan defineProperty , puede implementar la propiedad uniqueId como esta:
Para obtener más información, consulte https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty
fuente
En realidad, no es necesario modificar el
object
prototipo y agregar una función allí. Lo siguiente debería funcionar bien para su propósito.fuente
object
trucos. solo necesita ejecutarlo cuando desee que el objeto del OP coincida y permanece fuera del camino el resto del tiempo.Para los navegadores que implementan el
Object.defineProperty()
método, el siguiente código genera y devuelve una función que puede vincular a cualquier objeto que posea.Este enfoque tiene la ventaja de no extenderse
Object.prototype
.El código funciona comprobando si el objeto dado tiene una
__objectID__
propiedad, y definiéndolo como una propiedad oculta (no enumerable) de solo lectura si no es así.Por lo tanto, es seguro contra cualquier intento de cambiar o redefinir la
obj.__objectID__
propiedad de solo lectura después de que se ha definido, y arroja consistentemente un error agradable en lugar de fallar silenciosamente.Finalmente, en el caso bastante extremo en el que algún otro código ya se hubiera definido
__objectID__
en un objeto dado, este valor simplemente se devolvería.fuente
El código jQuery usa su propio
data()
método como tal id.En el backstage, el método
data
crea un campo muy especial en elobject
llamado"jQuery" + now()
put there next id de una secuencia de identificadores únicos comoTe sugiero que uses el mismo método, ya que John Resig obviamente sabe todo lo que hay sobre JavaScript y su método se basa en todo ese conocimiento.
fuente
data
método de jQuery tiene fallas. Consulte, por ejemplo, stackoverflow.com/questions/1915341/… . Además, John Resig de ninguna manera sabe todo lo que hay que saber sobre JavaScript, y creer que lo sabe no le ayudará como desarrollador de JavaScript.Versión mecanografiada de @justin answer, compatible con ES6, que usa símbolos para evitar cualquier colisión de teclas y se agrega al Object.id global para mayor comodidad. Simplemente copie y pegue el código a continuación o colóquelo en un archivo ObjecId.ts que importará.
Ejemplo de uso:
fuente
He usado un código como este, que hará que los Objetos se encadenen con cadenas únicas:
los
__proto__
bits son para evitar que el__id__
captador aparezca en el objeto. esto solo se ha probado en Firefox.fuente
__defineGetter__
no es estándar.A pesar del consejo de no modificar Object.prototype, esto aún puede ser realmente útil para probar, dentro de un alcance limitado. El autor de la respuesta aceptada la cambió, pero aún está configurando
Object.id
, lo que no tiene sentido para mí. Aquí hay un fragmento que hace el trabajo:fuente
Enfrenté el mismo problema y aquí está la solución que implementé con ES6
fuente
Con el fin de comparar dos objetos, la forma más sencilla de hacerlo sería agregar una propiedad única a uno de los objetos en el momento en que necesite comparar los objetos, verificar si la propiedad existe en el otro y luego eliminarlo nuevamente. Esto ahorra prototipos primordiales.
fuente