Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

Object.keys()やReflect.ownKeys()のまとめ

オブジェクトのプロパティを取得するメソッドが

  • 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となっております