Конструкция 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Автор: Вопрошатель (не зарегистрирован), дата: 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 подобный код работает)
Автор: nephilim (не зарегистрирован), дата: 1 июня, 2012 - 01:38
#permalinkЗдравствуйте, скажите, а можно ли перебирать свойства сразу 2-х объектов одним счетчиком?
for (var i obj1, obj2){ obj1[i]. obj2[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 } } };Автор: Гость (не зарегистрирован), дата: 3 июня, 2016 - 10:01
#permalinkПодскажите, кто-нибудь, как будет вести себя метод, если объект будет пуст. Сразу пропуск к следующей команде? Или out of bounds?