EnumerableOwnPropertyNames.js 1002 B

12345678910111213141516171819202122232425262728293031323334353637
  1. 'use strict';
  2. var $TypeError = require('es-errors/type');
  3. var objectKeys = require('object-keys');
  4. var safePushApply = require('safe-push-apply');
  5. var callBound = require('call-bound');
  6. var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
  7. var forEach = require('../helpers/forEach');
  8. var isObject = require('../helpers/isObject');
  9. // https://262.ecma-international.org/8.0/#sec-enumerableownproperties
  10. module.exports = function EnumerableOwnPropertyNames(O, kind) {
  11. if (!isObject(O)) {
  12. throw new $TypeError('Assertion failed: Type(O) is not Object');
  13. }
  14. var keys = objectKeys(O);
  15. if (kind === 'key') {
  16. return keys;
  17. }
  18. if (kind === 'value' || kind === 'key+value') {
  19. var results = [];
  20. forEach(keys, function (key) {
  21. if ($isEnumerable(O, key)) {
  22. safePushApply(results, [
  23. kind === 'value' ? O[key] : [key, O[key]]
  24. ]);
  25. }
  26. });
  27. return results;
  28. }
  29. throw new $TypeError('Assertion failed: "kind" is not "key", "value", or "key+value": ' + kind);
  30. };