2026-04-26
حلقه for...in و inherited properties
در JavaScript، حلقه for...in فقط own propertyها را نمیخواند و prototype chain را هم در نظر میگیرد.
for...in ابزار مفیدی است، اما فقط own keys شیء را iterate نمیکند.
این حلقه enumerable properties ارثرسیده از prototype chain را هم برمیگرداند.
const foo = { one: 1 };
const bar = { two: 2, __proto__: foo };
console.log(Object.keys(bar)); // ["two"]
for (const key in bar) {
console.log(key); // "two", "one"
}
اگر فقط own properties را میخواهید:
- از
Object.keys(obj)،Object.values(obj)یاObject.entries(obj)استفاده کنید. - یا داخل
for...inباObject.hasOwn(obj, key)فیلتر بگذارید.
for (const key in bar) {
if (Object.hasOwn(bar, key)) {
console.log(key);
}
}
دانستن این رفتار، جلوی باگهای سختردیابی را در object mapها میگیرد.