Preciso fazer alguns experimentos e conhecer algum tipo de identificador único para objetos em javascript, para ver se são iguais. Não quero usar operadores de igualdade, preciso de algo como a função id () em python.
Será que algo assim existe ?
javascript
Stefano Borini
fonte
fonte
Respostas:
Atualização Minha resposta original abaixo foi escrita há 6 anos em um estilo adequado à época e ao meu entendimento. Em resposta a alguma conversa nos comentários, uma abordagem mais moderna para isso é a seguinte:
Se você tiver requisitos de navegador arcaicos, verifique aqui a compatibilidade do navegador para
Object.defineProperty
.A resposta original é mantida abaixo (em vez de apenas no histórico de alterações) porque acho que a comparação é valiosa.
Você pode experimentar o seguinte. Isso também oferece a opção de definir explicitamente o ID de um objeto em seu construtor ou em outro lugar.
Tome cuidado para certificar-se de que qualquer membro que você usar para armazenar internamente o ID exclusivo não colida com outro nome de membro criado automaticamente.
fonte
object.hasOwnProperty(member)
ao usar umfor..in
loop. Esta é uma prática bem documentada e aplicada por jslintdefineProperty(…, {enumerable:false})
. E ouid
método em si deve estar noObject
namespace de qualquer maneira4
como você atribuiria obj com o id 4 a uma variável para que você possa fazer coisas com ele ... como acessar suas propriedades?Até onde vai minha observação, qualquer resposta postada aqui pode ter efeitos colaterais inesperados.
Em um ambiente compatível com ES2015, você pode evitar quaisquer efeitos colaterais usando o WeakMap .
fonte
return currentId
?WeakMap
que em oposição aMap
? Essa função irá falhar se você fornecer uma string ou número.Os navegadores mais recentes fornecem um método mais limpo para estender Object.prototype. Este código tornará a propriedade oculta da enumeração de propriedade (para p em o)
Para os navegadores que implementam defineProperty , você pode implementar a propriedade uniqueId como este:
Para obter detalhes, consulte https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty
fonte
Na verdade, você não precisa modificar o
object
protótipo e adicionar uma função lá. O seguinte deve funcionar bem para o seu propósito.fonte
object
hacks. você só precisa executá-lo quando quiser que o objeto do OP corresponda e ele não atrapalhe o resto do tempo.Para navegadores que implementam o
Object.defineProperty()
método, o código a seguir gera e retorna uma função que você pode vincular a qualquer objeto de sua propriedade.Essa abordagem tem a vantagem de não se estender
Object.prototype
.O código funciona verificando se o objeto fornecido tem uma
__objectID__
propriedade e definindo-o como uma propriedade somente leitura oculta (não enumerável), caso não tenha.Portanto, é seguro contra qualquer tentativa de alterar ou redefinir a
obj.__objectID__
propriedade somente leitura após ela ter sido definida e gera consistentemente um bom erro em vez de falhar silenciosamente.Finalmente, no caso extremo em que algum outro código já teria definido
__objectID__
em um determinado objeto, esse valor seria simplesmente retornado.fonte
O código jQuery usa seu próprio
data()
método como id.No backstage, o método
data
cria um campo muito especialobject
chamado,"jQuery" + now()
coloque o próximo id de um fluxo de ids únicos comoEu sugiro que você use o mesmo método que John Resig, obviamente sabe tudo sobre JavaScript e seu método é baseado em todo esse conhecimento.
fonte
data
método jQuery tem falhas. Veja, por exemplo, stackoverflow.com/questions/1915341/… . Além disso, John Resig de forma alguma sabe tudo o que há para saber sobre JavaScript, e acreditar que ele sabe não o ajudará como desenvolvedor de JavaScript.Versão datilografada de @justin answer, compatível com ES6, usando símbolos para evitar qualquer colisão de chaves e adicionado ao Object.id global por conveniência. Basta copiar e colar o código abaixo ou colocá-lo em um arquivo ObjecId.ts que você importará.
Exemplo de uso:
fonte
Usei um código como este, o que fará com que os objetos sequenciem com strings exclusivas:
os
__proto__
bits são para evitar que o__id__
getter apareça no objeto. isso só foi testado no firefox.fonte
__defineGetter__
não é padrão.Apesar do conselho de não modificar Object.prototype, isso ainda pode ser realmente útil para teste, dentro de um escopo limitado. O autor da resposta aceita mudou, mas ainda está definindo
Object.id
, o que não faz sentido para mim. Aqui está um snippet que faz o trabalho:fonte
Eu enfrentei o mesmo problema e aqui está a solução que implementei com ES6
fonte
Para efeito de comparação de dois objetos, a maneira mais simples de fazer isso seria adicionar uma propriedade única a um dos objetos no momento em que você precisa comparar os objetos, verificar se a propriedade existe no outro e removê-la novamente. Isso salva protótipos sobrescritos.
fonte