Object.keys()

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

Синтаксис

Object.keys(obj)

Параметри

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

Вертає

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

Опис

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

Приклади

// простий масив
var arr = ['а', 'б', 'в'];
console.log(Object.keys(arr));  // виводить ['0', '1', '2']

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

// масив як об'єкт з випадковим порядком ключів
var anObj = { 100: 'а', 2: 'б', 7: 'в' };
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)

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

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

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

// З 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 (ECMA-262)
The definition of 'Object.keys' in that specification.
Living Standard

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

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
keysChrome Full support 5Edge Full support 12Firefox Full support 4IE Full support 9Opera Full support 12Safari Full support 5WebView Android Full support 1Chrome Android Full support 18Firefox Android Full support 4Opera Android Full support 12Safari iOS Full support 5Samsung Internet Android Full support 1.0nodejs Full support Yes

Legend

Full support  
Full support

Див. також