Как вывести все свойства произвольно заданного объекта

Как вывести на консоль все свойства произвольно заданного объекта?

function _keys(obj){
         if (!isObject(obj)) return [];
         
         //Здесь должен быть ваш код
         
     }
     
     function isObject(obj){
        
        //Здесь должен быть ваш код
       
    }

Ответы (3 шт):

Автор решения: DiD

const hidden = Symbol.for('hidden');
 
const obj = {
 key_a: 'value_a',
 key_b: 'value_b',
 [hidden]: 'hidden_value'
};

// Выведет все ключи объекта
console.log(Object.keys(obj));

// Выведет все пары ключ-значение
console.log(Object.entries(obj));

// Выдаст имена свойств
console.log(Object.getOwnPropertyNames(obj));

// Выведет символы скрытых свойств
console.log(Object.getOwnPropertySymbols(obj));
//  * В песочнице console.log не выводит символы, 
//       но в консоли браузера выводит

// Выдаст все свойства с их getter-ами и setter-ами и правами доступа
console.log(Object.getOwnPropertyDescriptors(obj));

А вот так можно вывести ключи не только непосредственно самого объекта, но и наследуемых прототипов тоже:

console.log(keys(window));
console.log(keys(document));

function keys(obj){
  let key, keys = [];
  for(key in obj) keys.push(key);
  return keys;
}

→ Ссылка
Автор решения: Pavel Grishaev

function _keys(obj){
  if (!isObject(obj)) return [];
  
  console.log('Первый вариант:');
  console.log(obj);
  
  console.log('\n\nВторой вариант:');
  console.log( Object.keys(obj) );
  
  console.log('\n\nТретий вариант:');
  console.log( JSON.stringify(obj) );
  
  console.log('\n\nЧетвёртый вариант:');
  for (const [key, value] of Object.entries(obj)) {
    console.log(`${key}: ${value}`);
  }
  
}

function isObject(obj){
  return typeof obj === "object" && obj !== null;
}

_keys({
  width: 10,
  height: 30,
});

→ Ссылка
Автор решения: Roman

Для получения всех ключей объекта существует метод Object.keys()

Для получения всех свойств объекта существует метод Object.values()

Для того чтобы осуществить проверку на объект, можно использовать typeof, но в таком случае если будет передан массив, то typeof выдаст object, так же как и для объекта.

typeof({}); //'object'
typeof([]); //'object'

Поэтому можно воспользоваться такой конструкцией:

Object.prototype.toString.call(obj) === '[object Object]'

Есть более простой способ, но нужно воспользоваться опциональной цепочкой (?), так как в случае если не передать ничего в функцию, то будет TypeError, по той причине что будет вызываться метод toString на obj, а он в свою очередь будет undefined, соответсвенно метода toString у undefined не обнаружится и будет ошибка:

function isObject(obj) {
    return obj?.toString() === '[object Object]'
}

function _keys(obj){
   if (!isObject(obj)) return [];
   else return Object.keys(obj)
}

function _values(obj){
   if (!isObject(obj)) return [];
   else return Object.values(obj)
}

function isObject(obj){
  return Object.prototype.toString.call(obj) === '[object Object]'
}

console.log(_keys({f: 4, d: 5}))
console.log(_values({f: 4, d: 5}))

→ Ссылка