| 
	| 
	
	| 
		
	| 
			
			 
			
				04.07.2010, 16:44
			
			
			
		 |  
	| 
		
			
			| Аспирант       |  | 
					Регистрация: 15.01.2010 
						Сообщений: 43
					 
		
 |  |  
	| 
				Вопрос по array.length
			 Здравствуйте. Вот у меня тут возник спор с человеком, далеким от js - с "правильным программистом" C++.Суть спора такова, он утверждает, что конструкция
 for(i=0; i < arr.length; i++) не правильная, и что необходимо использовать конструкцию for(i=0, l = arr.length; i<l; i++), уверяя меня в том, что при каждом цикле for идет просчет arr.length. Но разве length не является внутренней переменной объекта array? Разве последней конструкцией мы не даем просто ссылку на arr.length?
 |  |  
	| 
		
	| 
			
			 
			
				04.07.2010, 17:02
			
			
			
		 |  
	| 
		
			|  | 猫       |  | 
					Регистрация: 07.06.2007 
						Сообщений: 7,504
					 
		
 |  |  
	| mexoboy,а слабо провести тест для обоих случаев и не полагаться на чьё-то мнение?
 
 ps: найдете когда-нибудь это важным для ускорения и сможете доказать, я с удовольствием вас послушаю.
 
 а так это сравнимо с прикручиванием педалей к истребителю
 			 Последний раз редактировалось Gozar, 04.07.2010 в 17:25.
				Причина: ps
 |  |  
	| 
		
	| 
			
			 
			
				04.07.2010, 17:55
			
			
			
		 |  
	| 
		
			|  | Рассеянный профессор       |  | 
					Регистрация: 06.04.2009 
						Сообщений: 2,379
					 
		
 |  |  
	| Я всегда "length = arr.length" пишу. Это называется кеширование значений. |  |  
	| 
		
	| 
			
			 
			
				04.07.2010, 18:56
			
			
			
		 |  
	| 
		
			|  | ⊞ Развернуть       |  | 
					Регистрация: 11.01.2010 
						Сообщений: 1,810
					 
		
 |  |  
	| 
	
 
	| Сообщение от mexoboy |  
	| Разве последней конструкцией мы не даем просто ссылку на arr.length |  
	
 Обратиться к свойству переменной дороже (в плане используемых операций), чем к самой переменной.
 
ЗЫ А еще правильней делать так 
for(i=0, l = arr.length; i<l; ++i)
 Или даже так 
for(i=arr.length; i--;)
			 Последний раз редактировалось B@rmaley.e><e, 04.07.2010 в 19:39.
				Причина: Исправил последний пример
 |  |  
	| 
		
	| 
			
			 
			
				04.07.2010, 18:57
			
			
			
		 |  
	| 
		
			
			| Аспирант       |  | 
					Регистрация: 15.01.2010 
						Сообщений: 43
					 
		
 |  |  
	| 2Gozar, ну вот как раз тесты ничего не показывают. при 5 миллионах итераций время всегда расходится в пользу разных методов, исходя из этого и был задан данный вопрос. Дело не в ускорении, а вообще в принципе работы array.length. Педали никто не собирается прикручивать, а спор остается спором. В другом другом языке вопросов-бы не было, но в js этот вопрос не тривиален. 
P.s. Да, действительно, l не будет являться ссылкой =( Странно, что во многих фреймворках как раз пишут без объявления переменной length, а обращаются на прямую к arr.length .
 
var a = [1,2,3];
var l = a.length;
a.push(4);
console.log(l);
			 Последний раз редактировалось mexoboy, 04.07.2010 в 19:12.
 |  |  
	| 
		
	| 
			
			 
			
				04.07.2010, 19:04
			
			
			
		 |  
	| 
		
			
			|       |  | 
					Регистрация: 10.07.2008 
						Сообщений: 3,873
					 
		
 |  |  
	| Не факт, что length реализовано, как getter. Даже можно сказать, что скорее всего это обычное свойство, потому что Array.prototype.push.call(obj, 1) добавит length к obj во всех браузерах, поэтому обращение к length массива происходит не дольше, чем к любому другому свойству объекта, содержащему числовое значение, которое не пересчитывается каждый раз. Вот с NodeList уже другое дело, это динамическая структура. 
Но я люблю гоняться за сверх скоростями и обычно пишу так:
 
var i = -1, length = array.length;
while (++i < length) {
    array[i]
}
если возможно, так:
 
var i = array.length;
while (i--) {
    array[i]
}
			 Последний раз редактировалось Octane, 04.07.2010 в 19:16.
 |  |  
	| 
		
	| 
			
			 
			
				04.07.2010, 19:11
			
			
			
		 |  
	| 
		
			|  | Рассеянный профессор       |  | 
					Регистрация: 06.04.2009 
						Сообщений: 2,379
					 
		
 |  |  
	| 
	
 
	| Сообщение от mexoboy |  
	| ну вот как раз тесты ничего не показывают |  
	
 еще от браузера многое зависит, плюс то, что Octane сказал.
 
	
 
	| Сообщение от B@rmaley.e><e |  
	| for(i=0, l = arr.length; i<l; ++i) |  
	
 А здесь что изменилось?			 Последний раз редактировалось Riim, 04.07.2010 в 19:13.
 |  |  
	| 
		
	| 
			
			 
			
				04.07.2010, 19:12
			
			
			
		 |  
	| 
		
			
			| Новичок на форуме       |  | 
					Регистрация: 19.02.2008 
						Сообщений: 9,177
					 
		
 |  |  
	| 
	
 
	| Сообщение от mexoboy |  
	| при каждом цикле for идет просчет arr.length |  
	
 Не идёт.
 
	
 
	| Сообщение от mexoboy |  
	| Но разве length не является внутренней переменной объекта array? |  
	
 Является. Только свойством, а не внутренней переменной.
 
	
 
	| Сообщение от Octane |  
	| Не факт, что length реализовано, как getter. |  
	
 Не реализовано, как геттер.
http://javascript.ru/ecma/part15#a-15.4.5.1 |  |  
	| 
		
	| 
			
			 
			
				04.07.2010, 19:26
			
			
			
		 |  
	| 
		
			|  | ⊞ Развернуть       |  | 
					Регистрация: 11.01.2010 
						Сообщений: 1,810
					 
		
 |  |  
	| 
	
 
	| Сообщение от Riim |  
	| А здесь что изменилось? |  
	
 Инкрементация. |  |  
	| 
		
	| 
			
			 
			
				04.07.2010, 19:32
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 03.04.2009 
						Сообщений: 1,263
					 
		
 |  |  
	| 
	
 
	| Сообщение от B@rmaley.e><e   |  
	| Обратиться к свойству переменной дороже (в плане используемых операций), чем к самой переменной. 
 ЗЫ А еще правильней делать так
 
for(i=0, l = arr.length; i<l; ++i)
Или даже так 
for(i=arr.length; --i;)
 |  
	
 Обожаю последний способ    Но с постинкрементом. Чтоли протестировать, может, преинкремент еще быстрее   UPD 
	
 
	| Сообщение от B@rmaley.e><e   |  
	| Инкрементация. |  
	
 Эээ... А так мы разве не пропустим нулевой элемент массива?			 Последний раз редактировалось e1f, 04.07.2010 в 19:33.
				Причина: upd
 |  |  
 
 
 
 |  |