Object.keys()‎

من موسوعة حسوب

الدالة Object.keys()‎ تُعيد مصفوفةً للخاصيات القابلة للإحصاء والتابعة لأحد الكائنات مباشرةً، وبنفس الترتيب الذي توفِّره حلقة التكرار for...in (والفرق بين هذه الدالة وحلقة التكرار هو أنَّ حلقة التكرار for...in ستمرّ على الخاصيات القابلة للإحصاء والموجودة في سلسلة prototype، ولن تقتصر على الخاصيات التابعة للكائن مباشرةً).

البنية العامة

Object.keys(obj)

obj

الكائن الذي نريد الحصول على خاصياته القابلة للإحصاء.

القيمة المعادة

مصفوفة تُمثِّل جميع الخاصيات القابلة للإحصاء والتابعة مباشرةً للكائن المعطي.

الوصف

لاحظ أنَّه في معيار ECMAScript 5 كان استعمال هذه الدالة على وسيطٍ ليس كائنًا (أي قيمةً أوليةً) سيؤدي إلى رمي TypeError، لكن بدءًا من ECMAScript 2015 (أي ES6) فستُعامل الوسائط التي لا تُمثِّل كائنات على أنها كائنات:

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

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

أمثلة

مثال عن استخدام هذه الدالة على مصفوفة:

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، ذلك لأنَّها غير قابلة للإحصاء (انظر صفحة الدالة Object.create()‎):

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

أما إذا أردتَ الحصول على جميع الخاصيات، بما في ذلك الخاصيات غير القابلة للإحصاء، فانظر إلى الدالة Object.getOwnPropertyNames()‎.

تعويض نقص دعم المتصفحات

لإضافة دعم للدالة 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;
    };
  }());
}

دعم المتصفحات

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي 5 4 9 12 5

مصادر ومواصفات