As duas instruções a seguir produzem a mesma saída? Existe alguma razão para preferir um caminho para o outro?
if (key in object)
if (object.hasOwnProperty(key))
javascript
Lorraine Bernard
fonte
fonte
in will also return true if key gets found somewhere in the prototype chain
? você pode escrever um exemplo? obrigado.({foo:"bar"}).hasOwnProperty("toString")
vs"toString" in ({foo:"bar"})
Vou tentar explicar com outro exemplo. Digamos que temos o seguinte objeto com duas propriedades:
Vamos criar uma instância do TestObj:
Vamos examinar a instância do objeto:
Conclusão:
O operador in retorna true sempre, se a propriedade estiver acessível pelo objeto, diretamente ou a partir do protótipo
hasOwnProperty () retorna true somente se a propriedade existir na instância, mas não em seu protótipo
Se quisermos verificar se existe alguma propriedade no protótipo, logicamente, diríamos:
Finalmente:
Então, com relação à afirmação de que essas duas condições ...
... produz o mesmo resultado, a resposta é óbvia, depende.
fonte
in
também verificará propriedades herdadas, o que não é o casohasOwnProperty
.fonte
Em resumo,
hasOwnProperty()
não procura no protótipo enquantoin
procura no protótipo.Retirado do O'Reilly High Performance Javascript :
fonte
Você tem ótimas respostas. Eu só quero oferecer algo que poupe a necessidade de verificar "hasOwnProperty" enquanto itera um objeto.
Ao criar um objeto, geralmente as pessoas o criam desta maneira:
Agora, se você quiser percorrer "someMap", precisará fazer o seguinte:
Estamos fazendo isso para evitar a iteração sobre propriedades herdadas.
Se você pretende criar um objeto simples que será usado apenas como um "mapa" (ou seja, pares de chave-valor), faça o seguinte:
Portanto, agora será seguro iterar assim:
Eu aprendi essa dica incrível aqui
fonte
(do Javascript de Crockford : The Good Parts )
fonte
in
operador é diferente dafor-in
declaração.in
é uma palavra-chave. Mas o OP está perguntando sobre o uso específico comoin
operador. Sua resposta lida com o outro uso como parte dafor-in
declaração.A primeira versão é mais curta (especialmente no código minificado, onde as variáveis são renomeadas)
vs
De qualquer forma, como o @AndreMeinhold disse, eles nem sempre produzem o mesmo resultado.
fonte