Javascript.RU

for..in

Перебрать свойства объекта, для каждого свойства выполнить заданный код

Синтаксис

for (property in object)
  statement

Аргументы

property
Переменная, которой последовательно присваиваются названия свойств объекта. Может быть объявлена при помощи var, но не будет при этом локальной для цикла
object
Объект, свойства которого перебираются
statement
Блок или javascript-вызов для вызова на каждой итерации

Описание, примеры

Конструкция for..in - единственный в javascript способ перебрать все свойства объекта.

var a = {
  p1: 1,
  p2: 2
}
for(var p in a) {
  alert(p) // p1, затем p2

  // к значению каждого свойства прибавить 1
  a[p] = a[p] + 1
}
Большинство свойств встроенных объектов javascript перебираться в цикле for..in не будут, так как помечены специальным внутренним флагом DontEnum.
Этот флаг нельзя получить или поменять.
Пример: встроенное свойство toString
// объявим объект
var a = {
  p1: 1
}

// у него есть свойство toString
alert(a.toString) 

// унаследованное от Object.prototype
alert(a.toString === Object.prototype.toString) // true

for(p in a) {
  // в этом цикле свойства toString не будет
  alert("Property name:"+p+" value:"+a[p])
}

Порядок перечисления свойств не определен.

Поэтому, если во время итерации добавить свойство к объекту - цикл может по нему пройти позже или не пройти никогда, в зависимости от того, куда это новое свойство встанет во внутренней хэш-таблице интерпретатора javascript.

При удалении свойства во время итерации - если цикл по нему еще не прошел, то он не пройдет в дальнейшем.

Перебор свойств, кроме унаследованных

Для перебора всех свойств объекта, кроме унаследованных, используется конструкция for..in с дополнительной проверкой.

for(var prop in object) {
  // если свойство унаследовано - continue
  if (!object.hasOwnProperty(prop)) continue

  // работа с prop
  ...
}

В следующем примере свойство print участвовало бы в цикле, если бы там не было проверки.

Пример: пербор без унаследованных свойств
Object.prototype.print = function() { 
  document.write(this) 
}
var a = {
  p1: 1,
  p2: 2
}
for(var p in a) {
  if (!a.hasOwnProperty(p)) continue
  alert(p)
}

См. также


Автор: Axdr, дата: 16 января, 2010 - 16:09
#permalink

Не всегда легко обращаться к свойству в цикле for..in. Вот пример, где это не работает. Вопрос: почему?

<script type="text/javascript" language="javascript">
window.onload = function () {
  var el = document.getElementsByTagName("input")[0];
  for (prop in el) {
    if (prop == "selectionStart") {
      var s = "selectionStart = " + el[prop];
      alert(s);
    }
  }
}
</script>
<input name="chc" type="radio" value="1" />chc1


Автор: Илья Кантор, дата: 16 января, 2010 - 16:58
#permalink

Конкретизируйте проблему - что не работает? Возможно, свойство имеет флаг DontEnum?


Автор: Axdr, дата: 18 января, 2010 - 07:37
#permalink

К "selectionStart" обратиться нельзя, т.к. el[prop] - вызывает ошибку
Если бы у свойства "selectionStart" было DontEnum, разве оно попало бы в for..in?


Автор: Гость (не зарегистрирован), дата: 13 августа, 2011 - 14:59
#permalink

возможно, el[prop] просто не может быть приведено к строке?


Автор: B@rmaley.e><e, дата: 14 августа, 2011 - 11:41
#permalink

В JS есть что-то, что нельзя привести к строке?


Автор: Hudik (не зарегистрирован), дата: 19 августа, 2015 - 17:55
#permalink

у input типа "radio" нет свойства selectionStart.

selectionStart есть, например, у типа "text".

Если заменить radio на text, то скрипт работает


Автор: Вопрошатель (не зарегистрирован), дата: 15 апреля, 2012 - 15:57
#permalink

Не работает рекурсия :

g.setHTML=function(dt,lev,p){
for (var i in dt){
var l=document.createElement("div");
l.className=g.struc['levelel'][lev]['funcstyle'];
p.appendChild(l);

var fn=_gr.elem[g.struc.levelel[lev].name].name;
var f=eval(fn+"(dt[i]['par'],g.struc.levelel[lev].funcstyle)");
l.appendChild(f.graph.body);
if (dt[i]['node']){g.setHTML(dt[i]['node'],lev+1,l);};
}
};

Проходит одну ветвь находя первые значения.
То есть такое ощущение,что передаваемая переменная dt является глобальной.
Как организовать рекурсию?(в php подобный код работает)


Автор: Hudik (не зарегистрирован), дата: 19 августа, 2015 - 18:52
#permalink

Мне кажется, причина в том, что через аргумент функции объекты передается не как новые объекты, а как указатели. Т.е. все рекурсивные вызовы будут указывать на один и тот же объект, переданный при вызове функции.
Где-то в теле надо через new создавать новый объект dt.


Автор: nephilim (не зарегистрирован), дата: 1 июня, 2012 - 01:38
#permalink

Здравствуйте, скажите, а можно ли перебирать свойства сразу 2-х объектов одним счетчиком?

for (var i obj1, obj2){
    obj1[i].
    obj2[i].
}


Автор: Гость (не зарегистрирован), дата: 1 июня, 2012 - 16:49
#permalink

Нет.
var x = {x: 1};
var y = {y: 2};
for(var i in x, y)
{
// что находится в i на первой итерации?
}


Автор: Александр222 (не зарегистрирован), дата: 24 апреля, 2014 - 09:43
#permalink

Здравствуйте, подскажите пожалуйста, как получить значение всех свойств age, не объявляя имена объектов в которых они находятся.

var massiveA = {
		a: {
			a: {
				name: 'nameA',
				age: 13
			},
			b: {
				name: 'nameB',
				age: 24
			}
		},
		b: {
			a: {
				name: 'nameC',
				age: 18
			},
			b: {
				name: 'nameD',
				age: 32
			}
		}
	};

Автор: Тряммм (не зарегистрирован), дата: 15 декабря, 2015 - 12:13
#permalink

Может кому-то пригодиться

function userArray(arr) {

for (var item in arr) {
if (arr[item].name) {
console.log('name=' + arr[item].name + ' age=' + arr[item].age);
}
else {
userArray(arr[item]);
}
}
}
userArray(massiveA);


Автор: Гость (не зарегистрирован), дата: 3 июня, 2016 - 10:01
#permalink

Подскажите, кто-нибудь, как будет вести себя метод, если объект будет пуст. Сразу пропуск к следующей команде? Или out of bounds?


Автор: Гость (не зарегистрирован), дата: 15 апреля, 2022 - 23:42
#permalink

Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 13:47
#permalink

Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
5 + 0 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum