Является ли, если с продолжительным шаблоном, чтобы предотвратить чрезмерное гнездование во время итерации по свойствам в JavaScript?

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

Вопрос

Я обычно использую этот шаблон, чтобы повторить свойства объекта:

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

Мне не нравится этот чрезмерный отступ, и недавно было указано мне, что я мог избавиться от этого, делая это:

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

   ...
}

Мне это нравится, потому что он не вносит дополнительный уровень отступа. Этот шаблон хорошо, или есть лучшие способы?

Это было полезно?

Решение

Я лично предпочитаю:

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

Нет дополнительного уровня отступа, потому что for, if, и т. Д. Примут следующее утверждение, если вы оставите фигурные брекеты. Так как мы поместим весь наш код внутри if hasOwnProperty блок это делает какие-либо брекеты для for Заявление ненужно.

По сути, это эквивалентно:

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

Другие советы

Синтаксически я бы предпочел что-то вроде этого

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
}

Выглядит приятно, но он влечет за собой две петли на один и тот же объект, не красивая производительность.

Другой способ сделать это функционально

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
});

Только один цикл, но функция вызывается для каждой итерации, которая не является большой производительностью, но лучше, чем последнее решение. Обратите внимание, что это также клобирует ценность this, но вы можете явно пропустить это значение как дополнительный 3-й аргумент.

Просто некоторые альтернативы. То, как вы это делаете, и путь, объясненный Даниэлем, просто отлично, и без компромиссов производительности.

Кроме того, я хотел бы отметить, что вы не имеют Чтобы отступить в свой код для каждой изрядной скобки ...

Одним из факторов зависит от того, слушаете ли вы Дуглас Крукфорд. В его книге JavaScript: хорошие части, он комки continue в с плохой части.

«Я никогда не видел кусок кода, который не был улучшен, ревертируя его удалить оператор продолжения». - Дуглас Крукфорд, JavaScript: хорошие части

Так как Тим Даун Упомянутый в своем комментарии, Крукфорд не дает причин в книге, чтобы объяснить, почему continue следует избегать. Но на его сайт Он говорит: «Это имеет тенденцию скрывать контрольный поток функции». Я только упоминаю мнение Крочнозада, так как многие считают его властью.

Лично я не вижу никаких проблем с тем, как вы закодировали свой цикл, тем более что continue Появится прямо в верхней части, где он не будет легко упускать из виду. Вы работаете с командой разработчиков? У них хорошее понимание того, что continue делает? У вас есть документ для конвенций кода, который говорит о том, как обращаться к глубокому вложению заявлений?

Макконнел:

Корпус с множеством перерывов может указывать на нечетное мышление о структуре цикла или его роли в окружающем коде. Чрезмерные разрывы возникают часто указывают на то, что петля может быть более четко выражена как серия петель. Использование перерыва устраняет возможность лечения петли в виде черного ящика. Управляйте условием выхода с петлей одним оператором, чтобы упростить ваши петли. «Перерыв» заставляет человека, читая ваш код, чтобы заглянуть внутрь, чтобы понять контроль цикла, что сложно понять петлю.

Dijkstra:

Особенности, как разрыв, как правило, саботируют преимущества структурированного программирования и предотвратить понимание программирования программы в качестве композиции независимых единиц

Петли с продолжением могут быть учтены в эту форму, и поэтому цикл может рассматриваться как черный ящик. Кроуфорд не прав. Ломает запах, но продолжать это хорошо.

дальнейший анализ: http://sites.google.com/site/dustingetz/dev/brecting-and-continue.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top