Ответ
Object.keys() возвращает массив строковых ключей только перечисляемых свойств объекта.
Object.getOwnPropertyNames() возвращает массив всех свойств (включая неперечисляемые), кроме символов.
Пример:
const obj = {
a: 1,
[Symbol('secret')]: 2
};
Object.defineProperty(obj, 'hidden', {
value: 3,
enumerable: false
});
console.log(Object.keys(obj)); // ['a']
console.log(Object.getOwnPropertyNames(obj)); // ['a', 'hidden']
Ключевые отличия:
Object.keysигнорирует неперечисляемые свойства- Оба метода не возвращают символьные свойства (для них есть
Object.getOwnPropertySymbols()) getOwnPropertyNamesвключает свойства, даже если они не участвуют в итерации (for...in)