Метод Object.keys() повертає масив імен особистих (не успадкованих) властивостей переданого об'єкта. Порядок властивостей в масиві є тим самим, що й у циклі for...in (різниця лише в тому, що цикл обходить також і властивості прототипу).

Синтаксис

Object.keys(obj)

Параметри

obj
Об'єкт, перелік властивостей якого треба отримати.

Вертає

Масив рядків, що передають імена всіх особистих властивостей переданого об'єкта.

Опис

Object.keys() повертає масив рядків, що передають імена властивостей, які належать безпосередньо об'єктові obj. Порядок отриманих властивостей збігається із тим, що його забезпечує перебір через for...in.

Приклади

var arr = ['a', 'b', 'c'];
console.log(Object.keys(arr));  // виводить ['0', '1', '2']

// масив як об'єкт
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj));  // виводить ['0', '1', '2']

// масив як об'єкт з випадковим порядком ключів
var anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(anObj));  // виводить ['2', '7', '100']

// метод getFoo є неперелічуваною властивістю
var myObj = Object.create({}, {
    getFoo: {
        value: function () { return this.foo; }
    } 
});
myObj.foo = 1;
console.log(Object.keys(myObj));  // виводить ['foo']

Якщо вам потрібен увесь перелік властивостей, включно із тими, що не є перелічуваними, зверніть увагу на Object.getOwnPropertyNames().

Зауваги

У ES5 метод викидає TypeError, якщо арґумент не є об'єктом (а натомість є простою величиною). Водночас у ES2015 арґумент, що належить до простого типу даних, буде перетворено на об'єкт.

Object.keys('foo');
// TypeError: "foo" is not an object (ES5 code)

Object.keys('foo');
// ["0", "1", "2"]                   (ES2015 code)

Запасний варіант (поліфіл)

Для старіших середовищ, де метод Object.keys() відсутній, можна забезпечити запасний варіант, скориставшись таким кодом:

// From https://developer.mozilla.org/uk/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
if (!Object.keys) {
  Object.keys = (function() {
    'use strict';
    var hasOwnProperty = Object.prototype.hasOwnProperty,
        hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),
        dontEnums = [
          'toString',
          'toLocaleString',
          'valueOf',
          'hasOwnProperty',
          'isPrototypeOf',
          'propertyIsEnumerable',
          'constructor'
        ],
        dontEnumsLength = dontEnums.length;

    return function(obj) {
      if (typeof obj !== 'function' && (typeof obj !== 'object' || obj === null)) {
        throw new TypeError('Object.keys called on non-object');
      }

      var result = [], prop, i;

      for (prop in obj) {
        if (hasOwnProperty.call(obj, prop)) {
          result.push(prop);
        }
      }

      if (hasDontEnumBug) {
        for (i = 0; i < dontEnumsLength; i++) {
          if (hasOwnProperty.call(obj, dontEnums[i])) {
            result.push(dontEnums[i]);
          }
        }
      }
      return result;
    };
  }());
}

Зауважте, що наведений код в IE7 (а також, можливо, в IE8) повертає також неперелічувані властивості для об'єктів, що їх отримано з іншого вікна.

Простий запасний варіант можна знайти в статті Javascript - Object.keys Browser Compatibility.

Специфікації

Специфікація Статус Коментар
ECMAScript 5.1 (ECMA-262)
The definition of 'Object.keys' in that specification.
Standard Первинне визначення. Реалізовано у JavaScript 1.8.5.
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Object.keys' in that specification.
Standard  
ECMAScript Latest Draft (ECMA-262)
The definition of 'Object.keys' in that specification.
Living Standard  

Підтримка веб-переглядачами

FeatureChromeEdgeFirefoxInternet ExplorerOperaSafari
Basic Support5 (Yes)49125
FeatureAndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
Basic Support (Yes) (Yes) (Yes) (Yes) (Yes) (Yes) (Yes)

Див. також

Мітки документа й учасники

 Зробили внесок у цю сторінку: asmforce, sblano4ka, bsurai
 Востаннє оновлена: asmforce,