Object.keys()

Object.keys() 静的メソッドは、指定されたオブジェクトが持つプロパティの名前の配列を、通常のループで取得するのと同じ順序で返します。

試してみましょう

構文

js
Object.keys(obj)

引数

obj

自身の列挙可能なプロパティが返されるオブジェクトです。

返値

与えられたオブジェクトのすべての列挙可能なプロパティを表す文字列の配列。

解説

Object.keys() は、 object で直接見つかった列挙可能なプロパティに対応する、文字列を要素とする配列を返します。これは for...in ループによる反復処理と同じですが、 for...in ループではプロトタイプチェーン内のプロパティも同様に反復処理します。 Object.keys() が返す配列の順序は、 for...in ループで指定された順序と同じです。

プロパティ値が必要な場合は、代わりに Object.values() を使用してください。プロパティのキーと値の両方が必要な場合は、代わりに Object.entries() を使用してください。

Object.keys() の使用

js
// 単純な配列
const arr = ["a", "b", "c"];
console.log(Object.keys(arr)); // ['0', '1', '2']

// オブジェクトのような配列
const obj = { 0: "a", 1: "b", 2: "c" };
console.log(Object.keys(obj)); // ['0', '1', '2']

// キーの順序がランダムなオブジェクトのような配列
const anObj = { 100: "a", 2: "b", 7: "c" };
console.log(Object.keys(anObj)); // ['2', '7', '100']

// getFoo は列挙可能ではないプロパティ
const myObj = Object.create(
  {},
  {
    getFoo: {
      value() {
        return this.foo;
      },
    },
  },
);
myObj.foo = 1;
console.log(Object.keys(myObj)); // ['foo']

列挙可能ではないものを含むすべてのプロパティを取得したい場合、Object.getOwnPropertyNames() をご覧ください。

プリミティブに対する Object.keys() の使用

オブジェクト以外の引数はオブジェクトへ変換されます。 undefinednull はオブジェクトに変換することができず、 TypeError を前もって発生します。文字列のみが自分自身で列挙可能なプロパティを持つことができ、他のすべてのプリミティブは空の配列を返します。

js
// 文字列は列挙可能な独自のプロパティとしてインデックスを持っている
console.log(Object.keys("foo")); // ['0', '1', '2']

// undefined と null以 外のプリミティブは、自分自身でプロパティを持つことはない
console.log(Object.keys(100)); // []

メモ: ES5 では、 Object.keys() にオブジェクト以外を渡すと TypeError が発生していました。

仕様書

Specification
ECMAScript Language Specification
# sec-object.keys

ブラウザーの互換性

BCD tables only load in the browser

関連情報