Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.07.2010, 16:44
Аспирант
Отправить личное сообщение для mexoboy Посмотреть профиль Найти все сообщения от mexoboy
 
Регистрация: 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?
Ответить с цитированием
  #2 (permalink)  
Старый 04.07.2010, 17:02
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

mexoboy,
а слабо провести тест для обоих случаев и не полагаться на чьё-то мнение?

ps: найдете когда-нибудь это важным для ускорения и сможете доказать, я с удовольствием вас послушаю.

а так это сравнимо с прикручиванием педалей к истребителю

Последний раз редактировалось Gozar, 04.07.2010 в 17:25. Причина: ps
Ответить с цитированием
  #3 (permalink)  
Старый 04.07.2010, 17:55
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Я всегда "length = arr.length" пишу. Это называется кеширование значений.
Ответить с цитированием
  #4 (permalink)  
Старый 04.07.2010, 18:56
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 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. Причина: Исправил последний пример
Ответить с цитированием
  #5 (permalink)  
Старый 04.07.2010, 18:57
Аспирант
Отправить личное сообщение для mexoboy Посмотреть профиль Найти все сообщения от mexoboy
 
Регистрация: 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.
Ответить с цитированием
  #6 (permalink)  
Старый 04.07.2010, 19:04
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 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.
Ответить с цитированием
  #7 (permalink)  
Старый 04.07.2010, 19:11
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 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.
Ответить с цитированием
  #8 (permalink)  
Старый 04.07.2010, 19:12
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 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
Ответить с цитированием
  #9 (permalink)  
Старый 04.07.2010, 19:26
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Сообщение от Riim
А здесь что изменилось?
Инкрементация.
Ответить с цитированием
  #10 (permalink)  
Старый 04.07.2010, 19:32
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 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
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос о циклических ссылках (JavaScript -> Dom -> JavaScipt) BlueIce Events/DOM/Window 10 17.02.2010 21:58
Вопрос про ООП, цепочки прототипов. Shaci Общие вопросы Javascript 5 27.01.2010 14:50
мааленький вопрос по Regexp:) mirniy Общие вопросы Javascript 1 22.01.2009 20:47
Вопрос по синтаксису mootools skyfish Общие вопросы Javascript 1 11.01.2009 17:15
вопрос по long poll megaswin AJAX и COMET 2 27.05.2008 09:20