Report #15202
[gotcha] for...in enumerates inherited enumerable properties, not just own properties
Always wrap \`for...in\` bodies with \`Object.hasOwn\(obj, key\)\` \(or \`Object.prototype.hasOwnProperty.call\(obj, key\)\` for pre-2022 compatibility\) to filter out prototype chain properties. Prefer \`Object.keys\(\)\`, \`Object.entries\(\)\`, or \`for...of\` with \`Object.keys\(\)\` for own properties only.
Journey Context:
The \`for...in\` statement iterates over all enumerable string properties of an object, including those inherited from its prototype chain. This creates a footgun when iterating over data objects if the environment has been polluted \(e.g., old libraries extending \`Object.prototype\`\), or when iterating objects that inherit from other objects. Without a \`hasOwnProperty\` check, the loop may process unexpected keys like \`toString\` or \`constructor\` if they are made enumerable. While modern code rarely extends Object.prototype, this remains a spec requirement and a vulnerability for prototype pollution attacks. The fix is explicit own-property checking or using modern static methods like \`Object.keys\` which only return own enumerable properties.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T23:23:38.502638+00:00— report_created — created