Конструкция 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)
}
Не всегда легко обращаться к свойству в цикле 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Конкретизируйте проблему - что не работает? Возможно, свойство имеет флаг
DontEnum?К "selectionStart" обратиться нельзя, т.к. el[prop] - вызывает ошибку
Если бы у свойства "selectionStart" было DontEnum, разве оно попало бы в for..in?
возможно, el[prop] просто не может быть приведено к строке?
В JS есть что-то, что нельзя привести к строке?
Отправить комментарий
Приветствуются комментарии:- Полезные.
- Дополняющие прочитанное.
- Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.Для остальных вопросов и обсуждений есть форум.