Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

for (var x in arr) (dimagolov, оценка: 1)
Author Message
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Sun Mar 07, 2010 9:14 pm (написано за 3 минуты 50 секунд)
   Post subject: for (var x in arr)
Reply with quote

Code (JavaScript): скопировать код в буфер обмена
var arr=['a', 'b', 'c'];
for (var x in arr) alert(x);
Всегда был уверен, что конструкция for (var x in arr) отдает все свойства объекта. Сегодня убедился, что FF 3.5.8, IE 6,7, Crome 4.0, Safari 4.0.4 (все Win32) не отдают свойство length для массива. Это так и должно быть и я пропустил что-то в описании for?
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 82
   поощрить/наказать


PostPosted: Mon Mar 08, 2010 6:46 pm (спустя 21 час 31 минуту; написано за 44 секунды)
   Post subject:
Reply with quote

dimagolov,
дело в том, что Array, это native объект языка, и для него for, видимо, не выводит все свойства.
Back to top
View user's profile Send private message Send e-mail
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 82
   поощрить/наказать


PostPosted: Mon Mar 08, 2010 6:58 pm (спустя 12 минут; написано за 1 минуту 23 секунды)
   Post subject:
Reply with quote

Кстати, если глянуть стандарт там четко прописано, что фор ин возвращает только те свойства, у которых нет флага "DontEnum".
А еще в стандарте написано, что свойства native объектов по умолчанию имеют этот флаг.
Back to top
View user's profile Send private message Send e-mail
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Mon Mar 08, 2010 7:08 pm (спустя 10 минут; написано за 19 секунд)
   Post subject:
Reply with quote

Александр Михалицын, это я понимаю в общем и целом. Я спрашивал про эволюцию этого момента от версии к версии и прямых указаниях в стандарте на этот счет.
Например, в Core JavaScript 1.5 Guide (developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Object_Manipulation_Statements#for...in_Statement):
Хотя в описании как бы не сказано, по каким именно свойствам идет перебор (вернее даже сказано что по всем):
Quote:
The for...in statement iterates a specified variable over all the properties of an object. For each distinct property, JavaScript executes the specified statements.
Но в ремарке про массив есть хитрое уточнение:
Quote:
Arrays
Although it may be tempting to use this as a way to iterate over Array elements, because the for...in statement iterates over user-defined properties in addition to the array elements, if you modify the Array object, such as adding custom properties or methods, the for...in statement will return the name of your user-defined properties in addition to the numeric indexes. Thus it is better to use a traditional for loop with a numeric index when iterating over arrays.
Из чего следует, что для массива for...in работает не так, как для "обычного" объекта.

Можно сделать общий вывод, что for...in ходит не по всем свойствам объекта, а только по назначенным пользователем. Спасибо за каммент про стандарт.
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 82
   поощрить/наказать


PostPosted: Mon Mar 08, 2010 7:45 pm (спустя 36 минут; написано за 26 секунд)
   Post subject:
Reply with quote

dimagolov,
javascript.ru/ecma/part12#a-12.6.4

javascript.ru/ecma/part15:
Quote:
В каждом случае свойство length каждого встроенного объекта Function, описанного в этом разделе, обладает атрибутами { ReadOnly, DontDelete, DontEnum } и никакими другими. Любое другое свойство в этом разделе обладает атрибутом { DontEnum } и никакими другими, если иное не указывается явно.
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Tue Mar 09, 2010 12:13 am (спустя 4 часа 27 минут; написано за 1 минуту 42 секунды)
   Post subject:
Reply with quote

Александр Михалицын, точная цитата
javascript.ru/ecma/part15#a-15.4.5.2 wrote:
    Свойство length данного объекта типа Array всегда численно больше, чем имя каждого свойства, имя которого является индексом массива.
    Свойство length обладает атрибутами { DontEnum, DontDelete }.
Иначе не работало бы
Code (JavaScript): скопировать код в буфер обмена
var arr = [100, 200, 300];
arr.length = 2;
// arr = [100, 200]
 
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 199
   поощрить/наказать

Location: 007 495

PostPosted: Wed Mar 17, 2010 8:12 pm (спустя 8 дней 19 часов 58 минут; написано за 1 минуту 42 секунды)
   Post subject:
Reply with quote

Кстати, что интересно, Firebug не показывает свойств у объектов типа Array, и JsHttpRequest тоже эти свойства игнорирует. Хотя при переборе, как оказалось, атрибут length даже не стал бы показываться :). Так что, вероятно, со стандартом ECMA хорошо знакомы лишь разработчики более-менее современных браузеров, а уже даже разработчики Firebug о таких «тонкостях» не знают.
Back to top
View user's profile Send private message Send e-mail
armix
Заглянувший



Joined: 23 May 2011
Posts: 12
Карма: 1
   поощрить/наказать


PostPosted: Tue Jul 19, 2011 10:04 am (спустя 1 год 4 месяца 1 день 13 часов 52 минуты; написано за 1 минуту 46 секунд)
   Post subject:
Reply with quote

Добрый день.
Есть хороший учебник по JavaScript:
Дэвид Флэнаган "JavaScript. Подробное руководство. 5-е издание".
"...Цикл for/in на самом деле не перебирает все свойства всех объектов. Так же как
некоторые свойства объектов помечаются как доступные только для чтения или
постоянные (не удаляемые), свойства могут помечаться как неперечислимые.
Такие свойства не перечисляются циклом for/in. Если все свойства, определен
ные пользователем, перечисляются, то многие встроенные свойства, включая
все встроенные методы, не перечисляются."
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Tue Jul 19, 2011 10:42 am (спустя 37 минут; написано за 33 секунды)
   Post subject:
Reply with quote

armix
Если весь учебник подобен приведённой цитате - выкиньте его.
Back to top
View user's profile Send private message
armix
Заглянувший



Joined: 23 May 2011
Posts: 12
Карма: 1
   поощрить/наказать


PostPosted: Tue Jul 19, 2011 4:54 pm (спустя 6 часов 12 минут; написано за 42 секунды)
   Post subject:
Reply with quote

С удовольствием.
Предложите лучше.
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 82
   поощрить/наказать


PostPosted: Tue Jul 19, 2011 7:57 pm (спустя 3 часа 2 минуты; написано за 1 минуту 28 секунд)
   Post subject:
Reply with quote

WingedFox, [+]

armix - стандарт ECMA-262-3 (когда вам требуются действительно глубокие представления о том, как же работает так или иная конструкция языка).
Back to top
View user's profile Send private message Send e-mail
armix
Заглянувший



Joined: 23 May 2011
Posts: 12
Карма: 1
   поощрить/наказать


PostPosted: Wed Jul 20, 2011 2:45 pm (спустя 18 часов 48 минут; написано за 2 минуты 35 секунд)
   Post subject:
Reply with quote

Спасибо.
Но для скорости понимания можно и Флэнагана использовать.
Для каждого уровня задания вопроса - свой инструмент.
У меня на всякий случай ещё и букварь по квантовой механике лежит.
(С электроникой-таки дело имеем!).
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 82
   поощрить/наказать


PostPosted: Wed Jul 20, 2011 3:56 pm (спустя 1 час 11 минут; написано за 32 секунды)
   Post subject:
Reply with quote

armix,
Quote:
Для каждого уровня задания вопроса - свой инструмент.
Именно.

Last edited by Александр Михалицын on Thu Jul 21, 2011 12:55 pm; edited 1 time in total
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Thu Jul 21, 2011 12:13 am (спустя 8 часов 16 минут; написано за 59 секунд)
   Post subject:
Reply with quote

armix wrote:
Но для скорости понимания можно и Флэнагана использовать.
Приведённая цитата как раз и показывает, что нельзя. Много разных букв, но смысла их сочетание не имеет.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML