Вебсправочник
Справочник JavaScript

for...in: перечислимые строковые свойства объекта

For...in перечисляет строковые ключи доступных перечислимых свойств, включая унаследованные. Поэтому при обработке собственных данных объекта нужно явно решить, допустим ли обход прототипа.

Назначение

For…in перечисляет строковые ключи доступных перечислимых свойств, включая унаследованные. Поэтому при обработке собственных данных объекта нужно явно решить, допустим ли обход прототипа.

Как это работает

Проверка Object.hasOwn отделяет собственное свойство от унаследованного. Символьные ключи этот цикл не возвращает. Для обычного набора собственных полей часто проще Object.keys или Object.entries.

Пример

const base = {shared:"base"};
const record = Object.create(base);
record.title = "Lesson";
const all = [];
const own = [];
for (const key in record) {
  all.push(key);
  if (Object.hasOwn(record, key)) own.push(key);
}
console.assert(all.includes("shared"));
console.assert(own.join(",") === "title");
console.log(all, own);

Что должно получиться

Общий список содержит shared из прототипа, отфильтрованный — только title. Это показывает, почему непроверенный обход может захватить больше данных, чем ожидалось.

Граница применения и частая ошибка

Не используйте for…in как основной цикл по значениям массива. Не полагайтесь на свойства объекта, полученного извне, как на доверенные команды приложения. Даже собственные ключи требуют проверки разрешённого набора перед изменением важных настроек.

Самостоятельная проверка

Добавьте ещё одно собственное поле и неперечислимое свойство через defineProperty. Сравните for…in, Object.keys и Reflect.ownKeys. Объясните различие результатов, не смешивая собственность и перечислимость.

Пример JavaScript проверяйте в собственном учебном файле или консоли своего проекта. Встроенная песочница справочника JavaScript не выполняет. Успешное выполнение в одной среде не гарантирует поддержку метода во всех браузерах.

Самостоятельный учебный материал. Техническая документация: первоисточник по теме ↗. Если результат отличается, проверьте код и версию браузера.