Language
Object.keys と for in: 継承プロパティの列挙が違う
Object.keysはown propertyだけ、for inは継承したenumerable propertyも列挙します。
Sourceenumeration.ts
Node.js 22
export const enumerableKeys = () => { const parent = { inherited: 1 }; const child = Object.create(parent) as { own: number }; child.own = 2; return { keys: Object.keys(child), iterated: (() => { const result: string[] = []; for (const key in child) result.push(key); return result; })() }; };Testenumeration.test.ts
Node.js 22
import assert from 'node:assert/strict'; import test from 'node:test'; import { enumerableKeys } from '../../src/object/enumeration.js';
test('Object.keysはown propertyだけ、for inは継承したenumerable propertyも列挙する', () => { assert.deepEqual(enumerableKeys(), { keys: ['own'], iterated: ['own', 'inherited'] }); });01Assertion
このテストで確認できること
- Object.keysはownだけ返す
- for inはinheritedも返す
オブジェクトを走査するAPIを選ぶときはプロトタイプ連鎖を含めるか明示します。
OBSERVED RESULT
keys → own
for in → own, inherited