현재 번역은 완벽하지 않습니다. 한국어로 문서 번역에 동참해주세요.

Object.keys() 메소드는 개체 고유의 열거형(enumerable) 속성들을 for...in 루프에 의해 제공되는 순서와 동일한 순서로 리턴합니다.
(차이점은 for-in 루프는 프로토타입 체인을 통하여 프로퍼티를 나열한다는 것입니다.)

문법

Object.keys(obj)

인수

obj
열거형 고유 속성이 반환될 개체.

반환값

지정된 개체의 모든 나열형 속성들을 나타내는 문자열 배열.

설명

Object.keys()object에서 직접 검색된 열거형 속성들에 대응하는 문자열들을 요소로 갖는 배열을 반환합니다. 반환된 요소는 객체의 요소 전체를 수동으로 반복(loop)하며 주워지는 순서와 동일합니다.

Examples

var arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']

// array like object
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // console: ['0', '1', '2']

// array like object with random key ordering
var anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(anObj)); // ['2', '7', '100']

// getFoo is property which isn't enumerable
var myObj = Object.create({}, {
  getFoo: {
    value: function () { return this.foo; }
  } 
});
myObj.foo = 1;
console.log(Object.keys(myObj)); // console: ['foo']

If you want all properties, even not enumerables, see Object.getOwnPropertyNames().

Notes

In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError. In ES2015, a non-object argument will be coerced to an object.

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

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

Polyfill

To add compatible Object.keys support in older environments that do not natively support it, copy the following snippet:

// From https://developer.mozilla.org/en-US/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;
    };
  }());
}

Please note that the above code includes non-enumerable keys in IE7 (and maybe IE8), when passing in an object from a different window.

For a simple Browser Polyfill, see Javascript - Object.keys Browser Compatibility.

Specifications

Specification Status Comment
ECMAScript 5.1 (ECMA-262)
The definition of 'Object.keys' in that specification.
Standard Initial definition. Implemented in 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  

Browser compatibility

Feature Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari
Basic support 5 (Yes) 4.0 (2.0) 9 12 5
Feature Android Chrome for Android Edge Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support ? ? (Yes) ? ? ? ?

See also

문서 태그 및 공헌자

 이 페이지의 공헌자: kooljay82, ibizcox
 최종 변경: kooljay82,