Tengo el siguiente código:
for (i in awards) {
if (awards[i] instanceof Array === false) {
console.log(awards[i]);
httpFactory.patch(awards[i], {"read": true}, false);
}
}
Mi IDE muestra este error relacionado con el código anterior:
Posible iteración sobre miembros inesperados (personalizados / heredados), probablemente falte la verificación hasOwnProperty
Comprueba si hay instancias de bucles for-in sin filtrar en JavaScript. El uso de esta construcción da como resultado el procesamiento de propiedades heredadas o inesperadas. Necesita filtrar sus propias propiedades con el método hasOwnProperty (). La validación funciona en archivos JavaScript, html o jsp.
¿Podría explicar con más detalle qué se entiende por esta afirmación?
javascript
Prometeo
fuente
fuente
hasOwnProperty
comprobaciones, me pregunto cuántas advertencias produciría ...Respuestas:
El IDE recomienda que agregue una prueba:
if (awards.hasOwnProperty(i)) { ... }
dentro del
for
bucle.Personalmente, recomiendo no hacer esto y deshabilitar la advertencia si es posible. Simplemente no hay necesidad en la mayoría del código, y aún menos en el código ES5, donde puede agregar de forma segura propiedades no enumerables a un objeto usando
Object.defineProperty
La
hasOwnProperty
verificación solo es necesaria si ha agregado nuevas propiedades (enumerables) deObject.prototype
manera insegura , por lo que la solución más simple es no hacer eso .jQuery no realiza esta prueba: documentan explícitamente que jQuery se romperá si
Object.prototype
se modifica de manera insegura.fuente
Cada objeto en javascript tiene un prototipo que tiene sus propias propiedades (métodos / propiedades nativos / heredados) y propiedades que están directamente asociadas al objeto en sí.
Cuando itera sobre un objeto, iterará las propiedades del propio objeto y las propiedades del prototipo del objeto.
Por lo tanto, para evitar iterar sobre el prototipo, se recomienda usar el método hasOwnProperty que devuelve verdadero solo cuando el objeto tiene la propiedad mencionada directamente. es decir, no dentro del prototipo
Ejemplo
for (var k in object) { if (object.hasOwnProperty(k)) { // do your computation here. } }
Puede encontrar más detalles aquí
fuente
También puede refactorizar su bucle en:
const keys = Object.keys(object); for (const key of keys){ // do something with object[key]; }
fuente
También puede deshacerse de la advertencia escribiendo un bucle forEach para un enfoque más legible y funcional:
Object.keys(object).forEach(key => { // Do something with object[key] });
fuente
deberías agregar una condición más al comienzo de este ciclo
if (awards.hasOwnProperty(i))
fuente