A for
- in
будет проходить через все перечислимые свойства объекта, даже в цепочке прототипов. Функция hasOwnProperty
может отфильтровывать те перечислимые свойства, которые находятся в цепочке прототипов. Наконец, функция propertyIsEnumerable
может различать перечислимые свойства объекта.
Следовательно, следующее script не должно печатать ничего:
for(a in window)
if(window.hasOwnProperty(a) && !window.propertyIsEnumerable(a))
console.log(a);
В Chrome, однако, вышесказанное печатает много имен свойств.
Почему циклы for
- in
и propertyIsEnumerable
противоречат друг другу в отношении перечислений?