Es un caso con un continuar un patrón bueno para evitar que se adhieran excesivo, mientras que la iteración en propiedades en Javascript?

StackOverflow https://stackoverflow.com/questions/3765723

Pregunta

I normalmente utilizar este modelo para iterar sobre las propiedades de objeto:

for(var property in object) {
   if(object.hasOwnProperty(property)) {
      ...
   }
}

No me gusta esta sangría excesiva y hace poco se me indicó que podía deshacerse de él al hacer esto:

for(var property in object) {
   if(!object.hasOwnProperty(property)) {
      continue;
   }

   ...
}

Me gusta esto porque no introduce el nivel extra de sangría. Es este patrón bien, o hay mejores formas?

¿Fue útil?

Solución

Yo personalmente prefiero:

for(var property in object) if(object.hasOwnProperty(property)) {
     ...
}

No hay un nivel extra de sangrado debido a for, if, etc. tendrá la siguiente instrucción si dejar de lado las llaves. Desde que ponemos todo nuestro código dentro del bloque if hasOwnProperty tiene ningún apoyos para la declaración for innecesaria.

En esencia es equivalente a:

for(var property in object) {
   if(object.hasOwnProperty(property)) {
     ...
   } else {
      continue;
   }
}

Otros consejos

Syntacticly prefiero algo como esto

function own(obj) {
  var ownprops = {};
  for (var prop in obj) 
    if (obj.hasOwnProperty(prop)) ownprops[prop] = 1;

  return ownprops;
}

for (var property in own(object)) {
 //code
}

Es bonito, pero conlleva dos bucles sobre el mismo objeto, no es bonito se refiere a rendimiento.

La otra manera de hacerlo es functionaly

function foreach(obj, func, thisp) {
  for (var prop in obj)
    if (obj.hasOwnProperty(prop)) func.call(thisp, obj[prop], prop);
}

foreach(object, function(val, key) {
  //code
});

Sólo un lazo, sino una función se llama para cada iteración, que no es un gran rendimiento en cuanto pero mejor que la anterior solución. Tenga en cuenta que también clobbers el valor de this, pero se puede pasar a ese valor de forma explícita como argumento tercera opcional.

A sólo algunas alternativas. La forma en que lo está haciendo, y la manera explicada por Daniel está muy bien, y sin compromisos de rendimiento.

Además, me gustaría señalar que no lo hace Tienes para sangrar el código para cada llave de un solo ...

Uno de los factores depende de si usted escucha a Douglas Crockford. En su libro, JavaScript:. La parte buena, que agrupa continue en la mal partes

"nunca he visto un trozo de código que no fue mejorada por refactorización para eliminar la sentencia continue." - Douglas Crockford, JavaScript: The Good Parts

Tim Abajo se ha mencionado en su comentario, Crockford da ninguna razón en el libro para explicar por qué continue debe ser evitado. Pero en su página web dice, "Se tiende a oscurecer el flujo de control de la función." Sólo menciono la opinión de Crockford ya que muchos lo consideran una autoridad.

En lo personal no veo ningún problema con la forma en que ha codificado su bucle, sobre todo porque el continue aparece a la derecha en la parte superior donde no será fácil pasar por alto. ¿Estás trabajando con un equipo de desarrolladores? ¿Tienen una buena comprensión de lo que hace continue? ¿Tiene un código de convenciones documento que habla sobre cómo manejar profundidad de anidamiento de las declaraciones?

McConnel:

Un bucle con muchas pausas puede indicar pensamiento claro acerca de la estructura del bucle o de su papel en el que rodea código. roturas excesivas plantea a menudo indica que el bucle podría expresarse más claramente como una serie de bucles. El uso de ruptura elimina la posibilidad de tratar un bucle como un cuadro negro. control de una condición de salida del bucle con uno declaración a simplificar sus bucles. 'break' fuerzas de la persona que lee su código para observar el interior de entender la de control de bucle, haciendo que el bucle más difícil de entender.

Dijkstra:

características como la ruptura tienden a sabotaje los beneficios de la estructura programación, y evitar que el programador de la comprensión de la programa como una composición de unidades independientes

Loops con continuar puede tenerse en cuenta en esta forma y por lo tanto el bucle puede ser tratada como un cuadro negro. Crawford es erróneo. Rompe el olor, sino que continúan es bueno.

análisis adicional: http://sites.google.com/site / dustingetz / dev / ruptura y seguir

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top