Является ли, если с продолжительным шаблоном, чтобы предотвратить чрезмерное гнездование во время итерации по свойствам в JavaScript?
-
04-10-2019 - |
Вопрос
Я обычно использую этот шаблон, чтобы повторить свойства объекта:
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.