オブジェクトのプロパティを取得するメソッドが
- Object.keys()
- Object.getOwnPropertyNames()
- Object.getOwnPropertySymbols()
- Reflect.ownKeys()
と、4種類も存在していてややこしかったので整理しました
メソッド名 | enumerable | 対象 |
---|---|---|
Object.keys(obj) | true | 文字列 |
Object.getOwnPropertyNames(obj) | true or false | 文字列 |
Object.getOwnPropertySymbols(obj) | false*1 | シンボル |
Reflect.ownKeys(obj) | true or false | 文字列 or シンボル |
Object.keys(obj)
は、objのプロパティのうち、enumerableであり文字列であるものを列挙します。
Object.getOwnPropertyNames(obj)
は、objのプロパティのうち、enumerableに関係なく文字列であるものを列挙します。
Object.getOwnPropertySymbols(obj)
は、objのプロパティのうち、シンボルであるものを列挙します。
Reflect.ownKeys(obj)
は、objのプロパティのうち、文字列であるもの、シンボルであるものすべてをenumerableに関係なく列挙します。
const o = {}; Object.defineProperty(o, 'not enumerable', {value: 'not enumerable', enumerable: false}); Object.defineProperty(o, 'enumerable', {value: 'enumerable', enumerable: true}); o[Symbol('symbol')] = 'symbol'; Object.keys(o); // [ 'enumerable' ] Object.getOwnPropertyNames(o); // [ 'not enumerable', 'enumerable' ] Object.getOwnPropertySymbols(o); // [ Symbol(symbol) ] Reflect.ownKeys(o) // [ 'not enumerable', 'enumerable', Symbol(symbol) ]
まあ、実用上使うことが一番多いのはやはりObject.keys()だと思います。
*1:ちなみに、シンボルのプロパティは常にenumerableがfalseとなっております