Являются ли циклы "for ... in" в Javascript всегда плохими? - PullRequest
3 голосов
/ 28 декабря 2011

У меня есть ситуация, когда я пытаюсь заставить работать с array, но я просто не думаю, что так и будет. Я хочу иметь список объектов, каждый из которых имеет уникальный идентификатор, и я хочу иметь возможность легко ссылаться на конкретный объект без необходимости циклически перемещаться по массиву в поисках этого идентификатора.

Если я использую object, я могу легко использовать уникальный идентификатор в качестве ключа и объект в качестве значения. Однако, если я использую объект вместо массива, мне придется использовать цикл for...in, и я знаю, что есть проблема, связанная с тем, что если кто-то, использующий мой код, расширил Object.prototype.

Так вот мой вопрос:

Действительно ли так распространено, что люди распространяют Object.prototype, что мне надоело его использовать? Есть ли другие причины, по которым я бы не хотел использовать цикл for...in?

С другой стороны, является ли снижение производительности при циклическом просмотре массива в поисках уникального идентификатора настолько минимальным, что мне не о чем беспокоиться?

(Кстати, в массиве, вероятно, будет довольно мало элементов, но я буду обращаться к нему очень часто. Кроме того, код, который я пишу, будет плагином jQuery, поэтому я не имею никакого контроля над тем, что другие плохие люди его объединяют.)

UPDATE:

Основываясь на рекомендациях @nnnnnn, я настроил тест jsperf и вот результаты: http://jsperf.com/accessing-object-properties-vs-iterating-over-arrays

В принципе, хотя путь объекта немного быстрее, разница незначительна. Тем не менее, использование for...in с hasOwnProperty кажется более чистым.

Ответы [ 3 ]

5 голосов
/ 28 декабря 2011

Даже если кто-то расширяет прототип, вы можете использовать свойство hasOwnProperty для исключения этих членов. Это именно то, что Sugar.js рекомендует :

var s = 'cat', key;
for(key in s) {
  if(s.hasOwnProperty(key)) {
    console.log(key);
  }
}

Теперь, согласно Sugar, for..in является принятым циклом для литералов объектов, но вы также можете использовать итератор, такой как $.each для jQuery или _.each для Underscore.js.

2 голосов
/ 28 декабря 2011

Так вот мой вопрос:

Действительно ли так часто люди расширяют Object.prototype, что я должен быть устал от его использования? Есть ли другие причины, по которым я бы не хотел использовать цикл for ... in?

Нет, это не часто, но это случается. В любом случае вы должны использовать цикл for..in, но с .hasOwnProperty(), как показано в других ответах.

Я не могу придумать никаких причин, чтобы не использовал for..in (для объекта; очевидно, вы не используете его для массива).

С другой стороны, является ли снижение производительности при циклическом просмотре массива в поисках уникального идентификатора настолько минимальным, что мне не о чем беспокоиться?

Что ж, вы упомянули, что в вашем массиве не будет много элементов, но все же я думаю, что даже если он будет работать хорошо, это излишне усложнит ваш код, учитывая, что вам вообще не нужно делать это для объектов. С другой стороны, использование .hasOwnProperty() является незначительным осложнением, которое фактически становится частью синтаксиса каждого for..in.

Вы можете настроить тест производительности здесь: http://jsperf.com/

2 голосов
/ 28 декабря 2011

Вы можете использовать метод hasOwnProperty в цикле for..in, чтобы отличить материал, находящийся дальше по цепочке прототипов, от материала, назначенного вашему объекту.

Или вы можете оставитьВаш собственный список «ключей», назначенных данному объекту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...