“for...in é aquele colega de equipe que fala até com o café da recepção. Já o Object.entries() só responde se for marcado no Slack.”

🤯 A treta da vez

Tava eu, revisando um código alheio e vi isso aqui abaixo:

// Student herdando o atributo name de person
const person = { name: 'Werliton Silva' };
const student = Object.create(person);

student.id = 12;
student.age = 25;

Em um trecho seguinte, houve a necessidade de listar todas as propriedades do objeto a partir de um loop, como segue:

// Student herdando o atributo name de person
const person = { name: 'Werliton Silva' };
const student = Object.create(person);

student.id = 12;
student.age = 25;

for (let [key, value] of Object.entries(student)) {
    console.log(key, value);
}
// resultado do console.log
// id 12
// age 25

A pessoa usou Object.entries(student) esperando que o name aparecesse.

E eu só pensei:

“Irmão, você caiu no bait do JavaScript clássico.”

🚫 Por que o name não aparece?

Porque Object.entries() (assim como Object.keys() e Object.values()) só retorna as propriedades PRÓPRIAS do objeto.

Se o valor veio do protótipo (ou herdado), ele é ignorado com gosto.

É tipo aquele parente distante que você só lembra no Natal. Tá lá, faz parte da família, mas você não chama pro churrasco do domingo.

✅ Quem traz tudo, até o que você não pediu?

O bom e velho for...in.

for (let key in student) {
    console.log(key, student[key]);
}

// resultado do console.log
// id 12
// age 55
// name Werliton Silva

Esse é fofoqueiro.

Vai puxar id, age e o name herdado da cadeia de protótipos.

Tem seu valor — só cuidado pra não trazer coisas demais pro seu loop.

🕵️ E se eu quiser saber de onde vem cada propriedade?

Use o lendário hasOwnProperty():

for (let key in student) {
    const origem = student.hasOwnProperty(key) ? 'própria' : 'herdada';
    console.log(`${key}: ${student[key]} (${origem})`);
}
// resultado do console.log
// id 12 (própria)
// age 55 (própria)
// name Werliton Silva (herdada)

Aí sim você vira o Sherlock Holmes da prototipagem. Dá até pra montar um console.table() bonito e jogar num log que vai parar em produção. (Brincadeira. Ou não.)

Conclusão

Se você está usando Object.entries() achando que vai listar tudo , tá igual eu achando que sei cozinhar só porque faço miojo com ovo.

Conheça suas ferramentas.

E mais importante: entenda como funciona a herança no JavaScript.

Ela é linda, poderosa, e traiçoeira como um bug na sexta-feira às 17h.

🚀 Werliton Silva

Especialista Frontend | Caçador de Bugs | Evangelizador do hasOwnProperty() desde 2012