¿Las siguientes dos declaraciones producen el mismo resultado? ¿Hay alguna razón para preferir un camino al otro?
if (key in object)
if (object.hasOwnProperty(key))
javascript
Lorena Bernard
fuente
fuente
in will also return true if key gets found somewhere in the prototype chain
? puedes escribir un ejemplo? Gracias.({foo:"bar"}).hasOwnProperty("toString")
vs"toString" in ({foo:"bar"})
Trataré de explicar con otro ejemplo. Digamos que tenemos el siguiente objeto con dos propiedades:
Creemos una instancia de TestObj:
Examinemos la instancia del objeto:
Conclusión:
en operador devuelve verdadero siempre, si el objeto puede acceder a la propiedad, directamente o desde el prototipo
hasOwnProperty () devuelve verdadero solo si la propiedad existe en la instancia, pero no en su prototipo
Si queremos verificar que exista alguna propiedad en el prototipo, lógicamente, diríamos:
Finalmente:
Entonces, con respecto a la declaración de que estas dos condiciones ...
... produce el mismo resultado, la respuesta es obvia, depende.
fuente
in
también verificará las propiedades heredadas, lo cual no es el casohasOwnProperty
.fuente
En resumen,
hasOwnProperty()
no se ve en el prototipo mientrasin
se ve en el prototipo.Tomado de O'Reilly High Performance Javascript :
fuente
Tienes algunas respuestas realmente geniales. Solo quiero ofrecer algo que le ahorrará la necesidad de marcar "hasOwnProperty" mientras itera un objeto.
Al crear un objeto, generalmente las personas lo crearán de esta manera:
Ahora, si desea iterar a través de "someMap", deberá hacerlo de esta manera:
Lo estamos haciendo para evitar iterar sobre propiedades heredadas.
Si tiene la intención de crear un objeto simple que solo se utilizará como un "mapa" (es decir, pares clave-valor), puede hacerlo así:
Así que ahora será seguro iterar así:
Aprendí este increíble consejo aquí
fuente
(del Javascript de Crockford : las partes buenas )
fuente
in
operador es diferente a lafor-in
declaración.in
es una palabra clave. Pero OP pregunta sobre el uso específico comoin
operador. Su respuesta trata con el otro uso como parte de lafor-in
declaración.La primera versión es más corta (especialmente en código minificado donde las variables cambian de nombre)
vs
De todos modos, como dijo @AndreMeinhold, no siempre producen el mismo resultado.
fuente